我正在尝试发送设置了 MD 和 RFH2 header 的 MQ 消息。 我需要消息在 AppWatch 上像这样显示。
但是 RFH2 部分作为消息数据的一部分作为连续字符串出现。
我使用以下代码:
MQMessage msg = new MQMessage();
msg.writeString("Data to go as Message Content");
//Setting MQMD values
msg.persistence = MQConstants.MQPER_PERSISTANT;
msg.encoding = MQConstants.MQENC_S390;
msg.characterSet = 500;
//Setting RFH2 Values
MQRFH2 rfh2 = new MQRFH2();
rfh2.setEncoding(CMSQC.MQENC_NATIVE);
rfh2.setCodedCharSetId(CMSQC.MQCCSI_INHERIT);
rfh2.setFormat(CMSQC.MQFMT_STRING);
rfh2.setFlags(0);
rfh2.setNameValueCCSID(1208);
rfh2.setFieldValue("mcd","msd","jms_text");
rfh2.setNameValueData(<xml><usr><ENTRYNUM>123</ENTRYNUM><text>TEST123</text></usr></xml>);
//Setting the Header to the Message
rfh2.write(msg);
MQQueue queue = qmngr.accessQueue(qname,MQConstants.MQOO_OUTPUT);
queue.put(msg,pmo);
queue.close;
有人可以帮我正确设置 RFH2 值吗?
注意:上面的屏幕截图只是一个示例,代码与该屏幕截图无关
最佳答案
But the RFH2 part comes as a part of Message data as a continous string.
是的,从技术上讲,MQRFH2 header 和文件夹是消息正文的一部分。
看来我在其他关于 MQRFH2 类的帖子中不够明确。做事的顺序很重要。
即如果你做了A,那么你的信息就是AB。如果你做了 B 那么 A 你的信息将是 BA。 MQ 不会重新排序。
您是否曾经查看过原始形式的 MQRFH2 消息?参见这里:https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.ref.dev.doc/q099250_.htm
有多种工具可以向您显示原始布局:amqsbcg、MQ Visual Edit、MO71 等...
从上面的代码来看,你做了相反的事情。您添加了消息负载,然后添加了 RFH2 header 和文件夹。这对于 MQ 来说是垃圾。
正确的顺序应该是 MQRFH2 后跟消息负载。
MQMessage msg = new MQMessage();
//Setting RFH2 Values
MQRFH2 rfh2 = new MQRFH2();
rfh2.setEncoding(CMQC.MQENC_NATIVE);
rfh2.setCodedCharSetId(CMQC.MQCCSI_INHERIT);
rfh2.setFormat(CMQC.MQFMT_STRING);
rfh2.setFlags(0);
rfh2.setNameValueCCSID(1208);
rfh2.setFieldValue("usr", "ENTRYNUM", "123");
rfh2.setFieldValue("usr", "text", "TEST123");
//Setting the Header to the Message
rfh2.write(msg);
msg.writeString("Data to go as Message Content");
//Setting MQMD values
msg.persistence = CMQC.MQPER_PERSISTANT;
msg.format = CMQC.MQFMT_RF_HEADER_2;
MQQueue queue = qmngr.accessQueue(qname, CMQC.MQOO_FAIL_IF_QUIESCING + CMQC.MQOO_OUTPUT);
queue.put(msg,pmo);
queue.close;
<小时/>
2018 年 4 月 5 日更新。
好的 Faizan,根据您下面的评论,您仍然没有明白。
我运行了一个示例 JMS MQ 程序,它将以下消息数据放入队列中:“很好的简单测试。‘ms’时间为 -> 1522946795894”。
注意:我将 MQ 可视化编辑首选项从“将消息属性显示为命名属性”更改为“将消息属性显示为消息正文中的 MQRFH2 结构”。 (有关详细信息,请参阅这篇关于 MQGetMessageOptions 的帖子的底部)。
MQ Visual Edit 的前 3 个屏幕截图向您展示了消息在队列中的外观(如您所见):
屏幕截图 #1 显示消息的 MQMD 格式为“MQHRF2”:
屏幕截图 #3 显示了针对 MQRFH2 正确格式化的消息:
如果我将 MQ Visual Edit 的首选项切换回“将消息属性显示为命名属性”,则(这是完全相同的消息):
屏幕截图 #4 显示消息的 MQMD 格式为“MQSTR”(字符串):
屏幕截图 #7 显示 MQRFH2 文件夹中的所有值现在都是命名属性:
注意:在这两种情况下,它是相同的消息,但不同之处在于您希望 RECEIVING 应用程序如何处理它。
MQGetMessageOptions 类有一个名为“options”的选项字段。您可以向该字段添加(或)MQGMO_PROPERTIES_IN_HANDLE 或 MQGMO_PROPERTIES_FORCE_MQRFH2 选项。现在,您似乎正在使用 MQGMO_PROPERTIES_FORCE_MQRFH2。请参阅此处了解更多信息:https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.ref.dev.doc/q096780_.htm
关于java - 在 IBM MQ 中设置 MQRFH2 header 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49616262/