【问题标题】:How to get number of consumers connected to Websphere MQ queue from Java如何从 Java 获取连接到 Websphere MQ 队列的消费者数量
【发布时间】:2014-06-24 18:03:49
【问题描述】:

我正在尝试从 Java 获取特定 Websphere MQ 队列的消费者数量?在将消息放入队列之前,我需要知道是否有人会使用这些消息。

【问题讨论】:

    标签: java ibm-mq


    【解决方案1】:

    首先,值得注意的是,所提出的设计是一个非常非常糟糕的设计。效果是将异步消息传递回同步消息传递。这将消息生产者与消费者耦合在一起,引入了位置和解析依赖关系,破坏了集群,破坏了 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 other 上,而不是连接消息发送者的地方,则此方法将不起作用。当然,消息发送者和接收者驻留在不同的 QMgrs 上是正常情况。但是,由于您对设计没有提及太多,因此出于此答案的目的,我假设来自消息生产者和消费者的连接附加到同一个 QMgr。如果不是这样,我们需要就 PCF 进行讨论,甚至对设计发出更强烈的警告。

    【讨论】:

    • 感谢您对设计的建议。我使用消费者的数量作为触发器是否在队列上放置停止消息并停止使用消息的进程。如果队列没有消费者,则没有什么可停止的,并且一旦进程重新启动,放置消息只会导致稍后过早停止。你碰巧有一个java代码sn-p吗?
    • 如前所述,通常的方法是将操作/仪表从业务应用程序中分离出来。 WMQ 内置了一个工具,可以在队列深度从零变为非零时启动应用程序实例,并且当队列深度超过预设的高或低阈值时,可以让 WMQ 发送控制消息。如果需要更复杂的东西,通常监控或检测守护程序会监控队列并根据需要启动/停止应用程序实例。你看过 WMQ 附带的代码示例吗?
    • 我还没有看到任何使用 MQINQ for Java 的示例。
    猜你喜欢
    • 2016-02-03
    • 2013-12-27
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多