我想通过rfh2标头以及jms和usr文件夹向mq发送消息。首先检查此link并提出以下代码。但是,使用下面的代码放置消息后,我得到了MQ错误代码'2142'(代表错误的头值)。有人可以帮上忙。另外,我如何修改代码以包含jms和usr内容?

pubCommand = "<psc><Command>Publish</Command><Topic>Stock</Topic>" +

"<QMgrName>QFLEXT1</QMgrName><QName>QFLEXT1.A</QName></psc>";

int folderLength = pubCommand.length();
MQMessage sendmsg = new MQMessage();
//sendmsg.format = MQC.MQFMT_STRING;
sendmsg.format = MQC.MQFMT_RF_HEADER_2; // Msg Format
sendmsg.feedback = MQC.MQFB_NONE;
sendmsg.messageType = MQC.MQMT_DATAGRAM;
sendmsg.replyToQueueName = "MY.TEST.Q";
sendmsg.replyToQueueManagerName = qManager;
sendmsg.writeString(MQC.MQRFH_STRUC_ID); // StrucId
sendmsg.writeInt4(MQC.MQRFH_VERSION_2); // Version
sendmsg.writeInt4(MQC.MQRFH_STRUC_LENGTH_FIXED_2 + folderLength + 4);
sendmsg.writeInt4(MQC.MQENC_NATIVE); // Encoding
sendmsg.writeInt4(MQC.MQCCSI_DEFAULT); // CodedCharacterSetId
sendmsg.writeString(MQC.MQFMT_NONE); // Format (content)
sendmsg.writeInt4(MQC.MQRFH_NO_FLAGS); // Flags
sendmsg.writeInt4(1208); // NameValueCCSID = UTF-8
sendmsg.writeInt4(folderLength);
sendmsg.writeString(pubCommand);
MQPutMessageOptions pmo = new MQPutMessageOptions(); // accept the defaults, same
// as MQPMO_DEFAULT constant

String line = "test message";
sendmsg.clearMessage();
sendmsg.messageId = MQC.MQMI_NONE;
sendmsg.correlationId = MQC.MQCI_NONE;
sendmsg.writeString(line);

// put the message on the queue
queue.put(sendmsg, pmo);

最佳答案

正确的答案是,使用消息的提供程序应该使用受支持的现代版本的WebSphere MQ。在任何当前版本中,消息的使用者都可以指定他们是要查看RFH2标头还是消息属性。消息的生产者使用哪种方法都无关紧要,MQ进行必要的转换。

但是,如果您必须通过困难的方式执行此操作,请考虑以下事项:

// many lines to prepare the message body are executed here
String line = "test message";
sendmsg.clearMessage();
// WTF??  ^^^^^^^^^^  Doesn't this wipe out the RFH2 headers you just added?
//                    Any reason NOT to expect incorrect header values error?
sendmsg.writeString(line);
queue.put(sendmsg, pmo);


根据知识中心中的clearMessage page,“此方法将清除MQMessage对象的数据缓冲区部分。由于MessageLength,DataLength和DataOffset都设置为零,因此该数据缓冲区中的所有Message Data都将丢失。”

因此,当您准备将“测试消息”写入消息正文时,您刚刚添加的所有RFH2标头都已消失,消息长度重置为零。考虑到没有用于QMgr解析的RFH2标头,收到的错误似乎是适当的。

关于消息使用者使MQ提供RFH2标头的能力,请参见:MQ知识中心的PROPCTL queue options,尤其是FORCE选项。

09-27 06:15
查看更多