2014-05-07 46 views

回答

3

首先,值得注意的是,所提出的设计是一个非常非常糟糕的设计。其效果是将异步消息传递回同步消息。这将消息生成器与消费者相结合,引入位置和解决方案依赖关系,打破集群,挫败WMQ的负载分配和平衡,将网络拓扑嵌入应用程序,并使整个系统变得脆弱。请不要指责WMQ在故意击败除实际队列/出列操作之外的所有最佳功能后无法正常工作。

但是,要直接回答您的问题,请使用队列对象的getOpenInputCount方法来获取打开的输入句柄的数量。方法如下:

MQQueue outQ = qMgr.accessQueue(qName, 
           openOptions, 
           null,   // default q manager 
           null,   // no dynamic q name 
           null);   // no alternate user id 

int inCount = outQ.getOpenInputCount(); 

请注意,您只能查询本地队列上的输入句柄。如果队列托管在QMgr 其他之上,那么该方法将不起作用。当然,正常情况下,消息发送者和接收者将驻留在不同的QMgr上。然而,由于你没有提及设计,所以我将假设这个答案的目的是来自消息生产者和消费者的连接连接到同一个QMgr。如果情况并非如此,我们需要讨论PCF,甚至更强烈地警告设计。

+0

感谢您对设计的建议。我正在使用消费者数量作为触发器是否在队列中放置停止消息并停止消耗消息的过程。如果队列中没有消费者,则没有任何可以停止的地方,并且一旦进程重新启动,放置消息只会导致过早停止。你碰巧有这个java代码片段吗? – Mensur

+0

如前所述,通常的方法是将操作/检测与业务应用程序分开。当队列深度从零到非零时,WMQ中内置的工具可以启动应用实例,并且当队列深度超过预设的高或低阈值时,可以让WMQ发送控制消息。如果需要更复杂的东西,通常监视或工具守护进程会监视队列并根据需要启动/停止应用程序实例。你看过WMQ附带的代码示例了吗? –

+0

我还没有看到用于Java的MQINQ的任何示例。 – Mensur

相关问题