Mapping JMS Correlation ID to get Message from MQ(MQ7.0/JMS)

环境: WAS/MQ7.0(WAS配置MQ的JNDI)

通过mapping JMS 的 Correlation ID 同步接收返回消息,整了一天,总结一下

 

问题:

     在发送消息的时候,把生成的ID 的通过Message 的 setJMSCorrelationID() 的方法set进去

     然后在接收消息的时候,通过之前set的CorrelationID 收回的消息是null,发现没有mapping上

 

 

原因:

      一个是JMS的选择器(selector)写错了,应该写成带'ID:' 前缀的,example:

String selector = "JMSCorrelationID='ID:" + cId + "'"; QueueReceiver rcv = session.createReceiver(queue, selector);

 

还有一个,当你把id当成CorrelationID set到Message对象的时候,但消息send到MQ server的时候,有一个相关标识字节的属性,这个属性的值是你set的ID值的16进制,并且是48位的,当你同步接response消息的时候,是通过这个属性去mapping的,而不是你原始set的ID。

 

解决办法:

当你接消息的时候,把你原始的ID,转成定长48的16进制的String

example:

public String get48HexString(String cid) { byte[] bytes = cid.getBytes(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < bytes.length; i++) { sb.append(Integer.toHexString(bytes[i])); } int correlationIDLength = 48; int zerosToFill = correlationIDLength - sb.length(); for (int i = 0; i < zerosToFill; i++) { sb.append("0"); } return sb.toString(); } ---------------------------------------------- session.createReceiver(queue, "JMSCorrelationID='ID:" + get48HexString(msgId) + "'");

 

参考资料:(辛辛苦苦找了半天啊,不容易啊)

 

http://mqseries.net/phpBB2/viewtopic.php?t=5060&postdays=0&postorder=asc&start=0&sid=e49d679e0d652d29778544a35287b004

 

特别提醒:

IBM官网说,MQ版本7.0.1.0以上才支持 带ID:前缀的。。。低版本的我不知道怎么实现,欢迎补充。。

官网说明链接:http://www-01.ibm.com/support/docview.wss?uid=swg1IZ37281

你可能感兴趣的:(String,server,jms,IBM,null,byte)