使用Java设置WebSphere MQ RFH2头

时间:2014-09-04 13:50:28

标签: java ibm-mq

我想用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);

1 个答案:

答案 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选项。