JMS 接收 IBM Websphere MQ 消息报错 :JMSCC0065

具体堆栈报错信息如下:

com.ibm.msg.client.jms.DetailedMessageEOFException: JMSCC0065: 试图在消息结束后读消息。 试图在消息结束后读消息。如果应用程序已编写为使用 JMS 1.0.2 规范来读可变长度数据,那么这可能是正常情况。 必要时,重新编写应用程序以使用新的 getBodyLength() 方法。

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:44)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:39)
at java.lang.reflect.Constructor.newInstance(Constructor.java:516)
at com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:313)
at com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:390)
at com.ibm.msg.client.jms.internal.JmsErrorUtils.createException(JmsErrorUtils.java:104)
at com.ibm.msg.client.jms.internal.JmsBytesMessageImpl.readUTF(JmsBytesMessageImpl.java:1478)
at com.ibm.jms.JMSBytesMessage.readUTF(JMSBytesMessage.java:473)
at com.cs.soa.core.transport.MQ4JNDITransportImpl.getMessage(MQ4JNDITransportImpl.java:85)
at com.cs.soa.core.transport.MQ4JNDITransportImpl.getCSMessage(MQ4JNDITransportImpl.java:65)
at com.cs.soa.thread.MsgListenerThread.doLoop(MsgListenerThread.java:178)

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;
	}


你可能感兴趣的:(错误汇总及解决办法)