3

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

原因:com.ibm.mq.MQException:JMSCMQ0001:WebSphere MQ 调用失败,compcode '2' ('MQCC_FAILED') 原因 '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);

谢谢!

格里

4

1 回答 1

2

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

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

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