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:
还有一个,当你把id当成CorrelationID set到Message对象的时候,但消息send到MQ server的时候,有一个相关标识字节的属性,这个属性的值是你set的ID值的16进制,并且是48位的,当你同步接response消息的时候,是通过这个属性去mapping的,而不是你原始set的ID。
解决办法:
当你接消息的时候,把你原始的ID,转成定长48的16进制的String
example:
参考资料:(辛辛苦苦找了半天啊,不容易啊)
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
通过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
相关文章推荐
- Jabberd/XMPP 学习之三:jabber/xmpp中to,from、message,id,type,xml:lang的使用
- Using PowerCLI to get a Datastore from an NAA ID
- How to get an X11 Window from a Process ID?
- activemq 异常 Failed to start ActiveMQ JMS Message Broker. Reason: java.net.SocketException: No such device
- activemq报错:Failed to start ActiveMQ JMS Message Broker. Reason: java.io.EOFException: Chunk stream d
- message from server: "Host 'xxx' is not allowed to co
- How To Get Log, Trace Files In OA Framework Pages And Concurrent Request Programs (文档 ID 290614.1)
- HibernateException异常:identifier of an instance of bean was altered from 1 to 1(持久化对象ID变更)
- cygwin安装问题“unable to get setup.ini from<....>”的解决办法
- the method getcontextpath() from the type httpservletrequest refers to the missing type string
- JMeter学习(二十九)使用Jmeter创建ActiveMQ JMS POINT TO POINT请求,环境搭建、请求创建、插件安装、监听服务器资源等
- 布置Git环境Your working copy is out of date. Try pulling from the remote to get the latest change
- [From Linux Toy] inxi– bash script to get system information
- Unable to get view server version from device emulator-5554 解决办法
- How to get value from TextBox, RadioButtonList, DropDownList, CheckBox through JavaScript
- NFS:Unable to get nfsd port number from server, using default
- How to get kernel messages from Android?
- How to get the Values of Selected Row from a Gridview using ASP.NET
- The method getContextPath() from the type HttpServletRequest refers to the missing type
- Unable to get the focused window from device