我想用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);
答案 0 :(得分:1)
正确的 答案是,使用消息的提供程序应使用现代支持的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&#34; 此方法清除MQMessage对象的数据缓冲区部分。数据缓冲区中的任何消息数据都将丢失,因为MessageLength,DataLength和DataOffset都设置为零。&#34;
所以当你开始编写&#34;测试消息&#34;进入消息体后,您刚添加的所有RFH2标头都消失了,消息长度重置为零。考虑到QMgr没有解析的RFH2标头,收到的错误似乎是合适的。
关于消息使用者让MQ提供RFH2标头的能力,请参阅MQ知识中心中的PROPCTL queue options,特别是FORCE
选项。