我正在尝试发送带有MD和RFH2标头集的MQ消息。 我需要在AppWatch上显示这样的消息。
我正在使用以下代码:
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值。
注意:上面的屏幕截图只是一个示例,代码与该屏幕截图无关
答案 0 :(得分:2)
我能够通过稍微修改代码而不使用MQRFH2类来查看屏幕截图中显示的消息。
我还必须考虑Roger在他首先设置标题然后再设置消息有效负载的答案中提出的观点。
参考:http://www.mqseries.net/phpBB2/viewtopic.php?t=35456
f
答案 1 :(得分:1)
但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'是 - &gt; 1522946795894”。
注意:我将MQ Visual Edit Preferences从“将消息属性显示为命名属性”更改为“将消息属性显示为消息体中的MQRFH2结构”。 (有关更多信息,请参阅此帖子的底部有关MQGetMessageOptions的信息)。
MQ Visual Edit的前3个屏幕截图显示了消息在队列中的显示方式(正如您所看到的那样):
如果我将MQ Visual Edit的首选项切换回“将消息属性显示为命名属性”,那么(这是完全相同的消息):
屏幕截图#4显示消息的MQMD格式为'MQSTR'(字符串):
屏幕截图#7显示MQRFH2文件夹中的所有值现在都是命名属性:
注意:在这两种情况下,它都是SAME消息,但区别在于您希望RECEIVING应用程序如何处理它。
MQGetMessageOptions类有一个名为'options'的选项字段。您可以向该字段添加(OR)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