您的位置:首页 > 移动开发

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

2011-06-27 16:48 399 查看
环境: 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jms string ibm server byte null
相关文章推荐