通过JAVA从MQ读取消息的时候报错及解决

如果是通过 JAVA 将消息写入到 MQ,再通过 JAVA 去读取消息,采用 MQMessage 读消息的方法 readUTF() 去读取的时候,就不会报错,可以正常读出来。如果采用在 MQ 资源管理器中插入测试消息或者是通过另外一台 MQ 服务器往当前 MQ 服务器通过远程队例写消息过来,通过 JAVA 读取出会错,我这里疑点有两个:

1、通过 MQ 资源管理器放入的消息的编码是什么?是否在读消息的时候需要指定读消息的编码? 我通过 JAVA 进入的编码为 1381,读的时候也是 1381

2、我现在 JAVA 这边的 MQ LIB 是从 WEBSPHERE6 中取出来的,因为 MQ7 中带的 JAR 包老是报一些类不存在,现在的 MQ 服务是 V7,不知道是否与这个有关。

个人感觉第一种原因的可能性最大,但不知道 MQ 的默认字体是什么?

 

通过命令 DISPLAY QMGR 可以查看到当前 MQ 使用的默认字符集为 1381,其它的地方也说 MQ 在 WINDOWS 上安装的时候默认字符集为 1381,可是我通过 JAVA 程序去读的时候,设置的 CCSID 也为 1381,也是读的时候老是报如下错误:

java.io.EOFException
 at java.io.DataInputStream.readFully(Unknown Source)
 at java.io.DataInputStream.readUTF(Unknown Source)
 at java.io.DataInputStream.readUTF(Unknown Source)
 at com.ibm.mq.MQMessage.readUTF(MQMessage.java:1229)
 at test.MessageByMQ.getMessage(MessageByMQ.java:123)
 at test.MessageByMQ.main(MessageByMQ.java:146)

我通过 JAVA 往里面放消息设置的 CCSID 也为 1381 却可以正确读出来,但这里就搞不懂为什么读不出来了,

难道是上面提到的第三个原因,我的 JAR 包是 V6 的,MQ 是 V7 的?

 

基本解决:
原来读消息的方法为:readUTF()
但是这种方式在其它的应用程序采用 writeUTF 写入消息的时候不会报错,就是我上面提到的当前的 JAVA 程序可以读出该程序中写入的消息,
但是通过 MQ 资源管理器放入的测试消息就不是 UTF 这样的格式的,所以会报错,这说面从 MQ 中读消息的时候读取的格式必须与放入消息的格式相兼容,否则读取消息的时候会报错。
后来尝试采用 readLine 的方式去读取,可以正常读出来,但是如果写入的是 XML 这样的消息,采用 readLine 就不行了,后面尝试 readStringOfCharLength 方法,可以正常读出客户端应用程序通过 writeBytes 方法写入的消息,也可以正常读出通过 MQ 客户端放入的测试报文,
这个问题搞了我一整天,终于可以暂时放一下了。

 读的代码如下:

...

MQMessage retrieve = new MQMessage();
String message=retrieve.readStringOfCharLength(32000).trim();

...