具体堆栈报错信息如下:
com.ibm.msg.client.jms.DetailedMessageEOFException: JMSCC0065: 试图在消息结束后读消息。 试图在消息结束后读消息。如果应用程序已编写为使用 JMS 1.0.2 规范来读可变长度数据,那么这可能是正常情况。 必要时,重新编写应用程序以使用新的 getBodyLength() 方法。
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at com.cs.soa.thread.MsgListenerThread.run(MsgListenerThread.java:137)
报错原因:
发送方通过MQ 的API进行发送消息到MQ,而接收方系统采用的是java JMS 标准的API 去MQ接收消息,当有消息存在Queue里面,并且JMS方式调用QueueReceiver 的receive方法的时候就会报告此错误
解决办法:
我们暂时只能约定和发送方用同一套API进行对MQ的编程,统一使用java 标准的 JMS API
不知道有没有其他解决办法,求高人回帖。
-------------------------------------------------------------分割线-------------------2011--08--10
问题有进展了,是发送方发送消息的时候没有指定消息的格式,
生成MQMessage对象之后,指定一下消息的format:
MQMessage.format = MQC.MQFMT_STRING;
这样的话用JMS接消息就不会报之前的错误了,前提是两个应用的消息格式是String类型
--------------------------------------------------------------分割线---------------------2011-08-11
完美解决:
如果发送方用MQI 发送消息的时候没有指定format,那么接受方用JMS API 接受消息是默认是ByteMessage
用如下方法parse消息就可以了:
private static byte[] getByteArray(Message msg, String charSet) throws Exception {
byte byteArray[];
byteArray = (byte[]) null;
if (msg instanceof TextMessage)
try {
byteArray = ((TextMessage) msg).getText().getBytes(charSet);
} catch (Exception ex) {
throw new RuntimeException("UnsupportedEncoding: " + charSet, ex);
}
else if (msg instanceof BytesMessage) {
BytesMessage jmsByteMsg = (BytesMessage) msg;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte bytes[] = new byte[32];
for (int bytesRead = 0; (bytesRead = jmsByteMsg.readBytes(bytes, 32)) != -1;)
bos.write(bytes, 0, bytesRead);
byteArray = bos.toByteArray();
}
return byteArray;
}