java - IBM MQ 调用失败,代码为 '2' ('MQCC_FAILED' ),原因为 '2017' ('MQRC_HANDLE_NOT_AVAILABLE' )

标签 java ibm-mq

我在将一些数据放入回复队列时遇到以下错误。我的应用程序流程是我有一个 MQ 监听器(Spring Boot 容器),它持续监听 REQ 队列并处理 REQ 队列上收到的数据,最后将处理后的数据放入 REPLY 队列。

就我而言,在一定数量的请求和回复流之后在 REP 队列上发送数据时会出现问题,我确信当它达到最大句柄计数时,这个问题就会开始出现。为了进行临时修复,现在我正在重新启动 MQ Listener 容器。

有人可以帮助我在哪里检查 MAXHANDS 计数(我假设它在 MQ 端配置),并且有什么方法可以在重现问题的计数后检查吗?

注意:我正在使用 IBMMQ,所有队列基础设施均由 MQ 团队管理。

错误详细信息:

Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2017' ('MQRC_HANDLE_NOT_AVAILABLE').

非常感谢立即提供帮助。

public class MessageHandlerImplRCC implements SessionAwareMessageListener {
  @Override public void onMessage(Message message, Session session) {
    TextMessage imbMqReplyMessage = session.createTextMessage();
    imbMqReplyMessage.setJMSMessageID(message.getJMSMessageID());
    imbMqReplyMessage.setJMSCorrelationID(message.getJMSMessageID());
    imbMqReplyMessage.setText(dlmToDemiMappedString);
    MessageProducer messageProducerIBM = session.createProducer(message.getJMSReplyTo());
    messageProducerIBM.send(imbMqReplyMessage);
    message.acknowledge();
  }
}

最佳答案

要查看一个任务可以打开多少个句柄,请使用以下 MQSC 命令:-

DISPLAY QMGR MAXHANDS

默认情况下,这是 256。但是,您应该关闭不再使用的句柄,而不是增加此值。

发出以下 MQSC 命令来查找您的连接。

DISPLAY CONN(*) TYPE(CONN) APPLTAG

并在 APPLTAG 字段中查找您的应用程序名称,然后复制 CONN 值并发出以下 MQSC 命令:

DISPLAY CONN(paste-in-conn-value) TYPE(ALL) 

您将看到您已打开的所有队列。如果您认为不需要将它们全部打开,请关闭不需要的那些,例如使用:-

messageProducerIBM.close();

重新启动监听器会产生将它们全部关闭的效果,这会将句柄数设置回零。

关于java - IBM MQ 调用失败,代码为 '2' ('MQCC_FAILED' ),原因为 '2017' ('MQRC_HANDLE_NOT_AVAILABLE' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59525426/

相关文章:

java - 在 JMS 消息上添加传出拦截器

error-handling - 什么属于 DLQ/无效消息队列?

java - 如何限制 JMS DefaultMessageListenerContainer 重试消息的次数?

java - 什么时候创建分配给实例变量的对象

java - 如何检索 RDF 属性

java - 使用 servlet 将数据插入数据库返回空白页

java - 扩展 AbstractTableModel 的动态 JTable

java - 不同应用程序的类加载器可以不同吗?

java - 向 MQ 发送消息时如何删除默认的 Spring JMS 模板 header ?

java - 从java代码获取队列深度