在IBM MQ中设置MQRFH2标头时出现问题

时间:2018-04-02 17:59:30

标签: java ibm-mq

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

MQ MESSAGE ON 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值。

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

2 个答案:

答案 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个屏幕截图显示了消息在队列中的显示方式(正如您所看到的那样):

屏幕截图#1显示消息的MQMD格式为'MQHRF2': enter image description here

屏幕截图#2以HEX格式显示消息有效负载: enter image description here

屏幕截图#3显示为MQRFH2正确格式化的消息: enter image description here

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

屏幕截图#4显示消息的MQMD格式为'MQSTR'(字符串): enter image description here

屏幕截图#5以十六进制格式显示消息有效负载: enter image description here

屏幕截图#6将消息有效负载显示为: enter image description here

屏幕截图#7显示MQRFH2文件夹中的所有值现在都是命名属性: enter image description here

注意:在这两种情况下,它都是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