MQJE001:完成码'2'、原因码'2495'批量发消息报错求助
IBM MQ发送多条消息报错MQJE001: Completion Code '2', Reason '2495'排查
我尝试用以下Java代码向IBM MQ发送多条消息:
public static void main(String[] args) { int openOptions = CMQC.MQOO_INQUIRE | CMQC.MQOO_OUTPUT; MQEnvironment.hostname = "192.168.0.13"; MQEnvironment.port = 1414; MQEnvironment.channel = "SYSTEM.DEF.SVRCONN"; MQEnvironment.properties.put(CMQC.TRANSPORT_PROPERTY, CMQC.TRANSPORT_MQSERIES); MQQueueManager qMgr; MQMessage tmpMsg = new MQMessage(); try { qMgr = new MQQueueManager("QM1"); MQQueue destQueue = qMgr.accessQueue("TESTQ", openOptions); tmpMsg.write("Msg1".getBytes()); destQueue.put(tmpMsg, pmo); tmpMsg.clearMessage(); tmpMsg.write("Msg2".getBytes()); destQueue.put(tmpMsg, pmo); destQueue.close(); } catch (Exception e) { e.printStackTrace(); } finally { if(qMgr != null) qMgr.disconnect(); } }
但程序抛出错误MQJE001: Completion Code '2', Reason '2495'。我看到其他帖子提到可能是程序设置为绑定模式连接,但我的openOptions中未配置相关内容,请问该问题的原因是什么?
更新信息
我使用的客户端依赖为com.ibm.mq.allclient 9.3.2.0:
<dependency> <groupId>com.ibm.mq</groupId> <artifactId>com.ibm.mq.allclient</artifactId> <version>9.3.2.0</version> </dependency>
问题原因及解决方法
核心报错原因
MQ Reason Code 2495对应MQRC_UNEXPECTED_ERROR,本次报错的直接诱因是未初始化MQPutMessageOptions(即代码中的pmo变量)。调用destQueue.put()方法时,传入未初始化的pmo会导致客户端内部逻辑异常,最终触发该错误码。
关于绑定模式的误解
绑定模式的配置与openOptions无关,而是由TRANSPORT_PROPERTY决定。你设置的CMQC.TRANSPORT_MQSERIES属于自动模式,当客户端与MQ服务器同主机时会优先尝试绑定模式,失败后才切换到客户端模式,但这不是本次报错的直接原因。若要明确指定客户端模式,可改为CMQC.TRANSPORT_MQSERIES_CLIENT。
修复后的代码示例
public static void main(String[] args) { int openOptions = CMQC.MQOO_INQUIRE | CMQC.MQOO_OUTPUT; MQEnvironment.hostname = "192.168.0.13"; MQEnvironment.port = 1414; MQEnvironment.channel = "SYSTEM.DEF.SVRCONN"; // 明确指定客户端模式,避免自动模式切换 MQEnvironment.properties.put(CMQC.TRANSPORT_PROPERTY, CMQC.TRANSPORT_MQSERIES_CLIENT); MQQueueManager qMgr = null; MQMessage tmpMsg = new MQMessage(); // 初始化Put Message Options MQPutMessageOptions pmo = new MQPutMessageOptions(); try { qMgr = new MQQueueManager("QM1"); MQQueue destQueue = qMgr.accessQueue("TESTQ", openOptions); tmpMsg.write("Msg1".getBytes()); destQueue.put(tmpMsg, pmo); tmpMsg.clearMessage(); tmpMsg.write("Msg2".getBytes()); destQueue.put(tmpMsg, pmo); destQueue.close(); System.out.println("消息发送成功"); } catch (Exception e) { e.printStackTrace(); } finally { if(qMgr != null) { qMgr.disconnect(); } } }
额外检查点
- 确认MQ服务器的
SYSTEM.DEF.SVRCONN通道允许客户端连接,且队列管理器QM1处于运行状态。 - 验证队列
TESTQ已创建,且客户端用户拥有向该队列写入消息的权限。
内容的提问来源于stack exchange,提问作者Kaninchen
相关产品推荐
相关产品推荐

