java - 在 IBM MQ 中设置 MQRFH2 header 时出现问题

标签 java ibm-mq

我正在尝试发送设置了 MD 和 RFH2 header 的 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 值吗?

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

最佳答案

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”: enter image description here

屏幕截图 #2 显示了十六进制格式的消息负载: 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

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

相关文章:

java - 尝试创建一个使用参数方程绘制椭圆的程序,但线条未显示。为什么? ( java )

java - Facebook java API : what is the replacement for all the feed_* methods?

Java客户端-通过SSL访问Kubernetes集群和MQ集群

java - Mulesoft 中使用 SSL 的 WebMQ

c# - 通过 .net 客户端通过 SSL 连接到 IBM MQ

java - 从 MQ 获取字符串形式的关联 ID

java - 在运行时(调试时)比较 eclipse 中的 2 个对象?

java - 带接口(interface)的实例

java - 如何从命令提示符或管理控制台停止 Hybris 服务器

ssl - 在 MQ java 客户端中使用 SSL 时出错