Java使用IBM MQ发送消息时ApplicationIdData设置异常求助
解决IBM MQ Java客户端设置ApplicationIdData的问题
问题原因分析
直接设置
applicationIdData但接收端为空
你打开队列时使用了MQOO_SET_IDENTITY_CONTEXT选项,该选项会强制MQ使用队列打开时的身份上下文信息,覆盖消息本身携带的applicationIdData等身份字段,导致接收端无法获取你设置的值。添加
MQPMO_SET_IDENTITY_CONTEXT触发2095错误MQOO_SET_IDENTITY_CONTEXT(打开队列时设置身份上下文)与MQPMO_SET_IDENTITY_CONTEXT(发送消息时设置身份上下文)是冲突选项,同时使用会触发MQRC_CONTEXT_ERROR(原因码2095),这是MQ的设计限制。
解决方案
方案1:移除队列打开时的身份上下文选项(推荐,若无需固定队列身份)
如果你的场景不需要强制使用队列打开时的身份上下文,直接去掉MQOO_SET_IDENTITY_CONTEXT,消息的applicationIdData即可正常传递:
// 修改openOptions,移除MQOO_SET_IDENTITY_CONTEXT int openOptions = MQConstants.MQOO_OUTPUT | MQConstants.MQOO_INPUT_AS_Q_DEF | MQConstants.MQOO_INQUIRE; queue = mqManager.accessQueue(queueName, openOptions); int putOptions = MQConstants.MQPMO_ASYNC_RESPONSE; MQPutMessageOptions pmo = new MQPutMessageOptions(); pmo.options = putOptions; MQMessage msg = new MQMessage(); msg.applicationIdData = "TestId"; // 该值会被正常传递到接收端 msg.writeString(qmessage); queue.put(msg, pmo);
方案2:使用消息级身份上下文(若需保留队列打开的其他选项)
若需要保留队列打开时的其他选项,但要自定义身份信息,需移除MQOO_SET_IDENTITY_CONTEXT,并在发送消息时添加MQPMO_SET_IDENTITY_CONTEXT:
// 移除MQOO_SET_IDENTITY_CONTEXT int openOptions = MQConstants.MQOO_OUTPUT | MQConstants.MQOO_INPUT_AS_Q_DEF | MQConstants.MQOO_INQUIRE; queue = mqManager.accessQueue(queueName, openOptions); // 添加MQPMO_SET_IDENTITY_CONTEXT到putOptions int putOptions = MQConstants.MQPMO_ASYNC_RESPONSE | MQConstants.MQPMO_SET_IDENTITY_CONTEXT; MQPutMessageOptions pmo = new MQPutMessageOptions(); pmo.options = putOptions; MQMessage msg = new MQMessage(); msg.applicationIdData = "TestId"; msg.writeString(qmessage); queue.put(msg, pmo);
关键注意事项
MQOO_SET_IDENTITY_CONTEXT的作用是让所有通过该队列句柄发送的消息,统一使用打开队列时的身份(比如当前连接的用户ID),忽略消息自身的身份字段。- 若要传递自定义的
applicationIdData,必须确保队列打开选项和消息发送选项中,不存在冲突的身份上下文设置。
内容的提问来源于stack exchange,提问作者Mitu
相关产品推荐
相关产品推荐

