我正在尝试发送带有MD和RFH2标头设置的MQ消息。
我需要该消息在AppWatch上显示为这样。

java - 在IBM MQ中设置MQRFH2 header 时出现问题-LMLPHP
但是RFH2部分作为连续字符串作为Message数据的一部分出现。

我正在使用以下代码:

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值吗?

注意:上面的屏幕截图只是一个示例,并且代码与该屏幕截图无关

最佳答案

但是RFH2部分作为消息数据的一部分连续出现
  串。


是的,从技术上讲,MQRFH2头和文件夹是消息正文的一部分。

在关于MQRFH2类的其他文章中,我似乎不够明确。您做事的顺序很重要。

即,如果您执行A则B,则您的消息将是AB。如果您执行B,则您的消息将是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标头和文件夹。这对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 Visual Edit首选项”从“将消息属性显示为命名属性”更改为“在消息正文中将消息属性显示为MQRFH2结构”。 (有关更多信息,请参阅此帖子的底部有关MQGetMessageOptions的内容)。

MQ Visual Edit的前3个屏幕截图显示了消息在队列中的外观(如您所见):

屏幕快照1显示消息的MQMD格式为'MQHRF2':
java - 在IBM MQ中设置MQRFH2 header 时出现问题-LMLPHP

屏幕截图2显示了十六进制格式的消息有效负载:
java - 在IBM MQ中设置MQRFH2 header 时出现问题-LMLPHP

屏幕快照#3显示了正确格式化为MQRFH2的消息:
java - 在IBM MQ中设置MQRFH2 header 时出现问题-LMLPHP

如果我将MQ Visual Edit的首选项切换回“将消息属性显示为命名属性”,那么(这完全是相同的消息):

屏幕快照#4显示消息的MQMD格式为“ MQSTR”(字符串):
java - 在IBM MQ中设置MQRFH2 header 时出现问题-LMLPHP

屏幕截图5显示了十六进制格式的消息有效负载:
java - 在IBM MQ中设置MQRFH2 header 时出现问题-LMLPHP

屏幕截图6显示了消息有效负载为:
java - 在IBM MQ中设置MQRFH2 header 时出现问题-LMLPHP

屏幕快照7显示了MQRFH2文件夹中的所有值现在都被命名为Properties:
java - 在IBM MQ中设置MQRFH2 header 时出现问题-LMLPHP

注意:在两种情况下,它都是相同的消息,但是不同之处在于您希望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/

10-10 01:07