【问题标题】:MQSeries - Any setting to allow new receiver to take over connection?MQSeries - 允许新接收器接管连接的任何设置?
【发布时间】:2012-09-11 01:57:43
【问题描述】:

我们知道可以配置 MQ 服务器,如果已经有接收器连接到同一个 MQ 队列,则新接收器将无法连接到 MQ 服务器。错误将如下所示:

原因:com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2042' ('MQRC_OBJECT_IN_USE')

但是有没有办法配置服务器或客户端以允许新的接收器连接到 MQ 服务器并断开任何现有的接收器连接?

以下是我的接收器当前连接到服务器的方式。我想知道是否可以对 setIntProperty 做些什么。

cf = new MQQueueConnectionFactory();
cf.setHostName(mqHost);
cf.setPort(mqPort);
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setQueueManager(mqQueueManager);
cf.setChannel(mqChannel);

conn = (MQQueueConnection) cf.createQueueConnection();
session = (MQQueueSession) conn.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
queue = (MQQueue) session.createQueue(mqQueue);
receiver = (MQQueueReceiver) session.createReceiver(queue);

谢谢!

格里

【问题讨论】:

    标签: java ibm-mq


    【解决方案1】:

    好的,您在这里混合了不同的概念。您的应用程序正在使用 CLNTCONN 通道连接到 QMgr 的 SVRCONN 通道。在内存和系统资源允许的情况下,Yopu 可以在 SVRCONN 通道上拥有尽可能多的连接。连接不是问题。

    “2042”(“MQRC_OBJECT_IN_USE”)表示程序正在获得对队列的独占访问权。对此有两个修复:

    1. 不要对队列使用独占访问。检查队列的DEFSOPT 值是否设置为EXCLSHARED。如果您需要它可共享,请确保队列设置反映了这一点。
    2. 如果您需要队列保持独占(例如,因为消息依赖于顺序),请在尝试新连接之前停止先前的连接。当程序没有正常关闭连接时,孤立的通道代理会保持连接的队列处于打开状态。最终,代理超时并且任何独占输入队列再次变得可用。如果节目离开孤立频道,请修复节目。作为短期措施,您可以手动停止孤立通道以释放输入队列上的锁定。

    【讨论】:

    • 您好 Rob,非常感谢您的回复。是否有任何设置一次只允许一个连接,而新连接总是可以接管现有连接?谢谢,格里
    • 没有。现有连接可能有未完成的事务。攻击者可能会通过向 QMgr 发送尝试连接到所有队列的尝试来执行拒绝服务。这种方法的问题清单很长,很可怕,并且涉及到许多系统可靠性和数据完整性问题。如果应用程序独占使用队列,WMQ 会假定这是因为它是您想要的,并且会努力保持该连接的可靠和稳定,直到应用程序放弃它或管理员(或监控代理)手动获取连接。
    猜你喜欢
    • 2023-03-21
    • 2021-08-17
    • 1970-01-01
    • 2019-11-03
    • 2015-10-05
    • 2019-01-07
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多