XMS.NET向回复/输出队列发送响应出错,请求技术排查
问题排查:XMS.NET发送响应至MQ回复队列时ID格式问题
核心问题分析
问题根源在于XMS.NET对MQ原生ID的格式要求与原生MQ API存在差异:
- 原生MQ API中,
MessageId和CorrelationId是24字节的二进制数组,你通过StringToByte将十六进制字符串转成字节数组设置,符合MQ的底层要求。 - XMS.NET中,对应
JMSMessageID和JMSCorrelationID的字符串必须带ID:前缀,才能被解析为对应的二进制ID;如果直接传入纯十六进制字符串,XMS会将其当作普通文本处理,导致MQMD中的二进制ID与预期不符,进而引发关联失败或队列处理异常。
你的代码仅传入了ID的十六进制部分(去掉了ID:前缀),这是导致格式不匹配的直接原因。
修正方案
方案1:保留完整ID:前缀设置ID
直接使用读取到的请求消息中带ID:前缀的完整ID字符串,这是XMS.NET映射MQ原生ID的标准格式:
ITextMessage txtReplyMessage = sessionOut.CreateTextMessage(); // 使用带ID:前缀的完整ID字符串 txtReplyMessage.JMSMessageID = "ID:616365323063633033343361313165646139306638346264"; txtReplyMessage.JMSCorrelationID = "ID:36626161303030305f322020202020202020202020202020"; txtReplyMessage.Text = sentMessage.Contents; txtReplyMessage.JMSDeliveryMode = DeliveryMode.NonPersistent; txtReplyMessage.JMSPriority = sentMessage.Priority; messagePoducerOut.Send(txtReplyMessage);
方案2:仅设置关联ID(推荐)
通常,响应消息的JMSMessageID应由XMS自动生成(作为响应消息的唯一标识),只需将JMSCorrelationID设置为请求消息的JMSMessageID,即可实现请求-响应的关联:
// 假设requestMessage是读取到的请求消息实例 ITextMessage txtReplyMessage = sessionOut.CreateTextMessage(); // 复用请求消息的MessageID作为响应的CorrelationID txtReplyMessage.JMSCorrelationID = requestMessage.JMSMessageID; // 无需手动设置JMSMessageID,由XMS自动生成 txtReplyMessage.Text = sentMessage.Contents; txtReplyMessage.JMSDeliveryMode = DeliveryMode.NonPersistent; txtReplyMessage.JMSPriority = sentMessage.Priority; messagePoducerOut.Send(txtReplyMessage);
验证步骤
- 发送修正后的消息后,用MQ Explorer查看回复队列中的消息,检查
MQMD标签下的MessageId和CorrelationId字段:- 确认格式为
ID:<48位十六进制字符> - 对比请求消息的对应字段,确保十六进制字符串完全匹配
- 确认格式为
- 与之前用原生MQ API发送的消息对比,确认
MQMD中的ID字段完全一致
内容的提问来源于stack exchange,提问作者b_patil
相关产品推荐
相关产品推荐

