【发布时间】:2018-03-20 01:43:16
【问题描述】:
我最近开始使用 IBM MQ (v7.5),目前正在为 MQ 和我拥有的另一个 REST 服务之间的 2 路数据传输开发类似桥的服务。
通过使用标准 API,我可以毫无问题地读取和写入消息。 但是当我开始为我的消息设置 MQRFH2 标头时,我面临的问题就出现了。我在使用标头写入数据时一定犯了一些错误,因为每次我在读取这些消息时都会收到“End of file exception ('MQMessage.seek()').”错误。
这是我将消息放入 MQ 时的代码 sn-p:
//Constructing message
MQMessage sendmsg = new MQMessage();
sendmsg.characterSet = 1208;
sendmsg.format = MQC.MQFMT_STRING;
sendmsg.feedback = MQC.MQFB_NONE;
sendmsg.messageType = MQC.MQMT_DATAGRAM;
sendmsg.replyToQueueName = outputBackupQueueName;
sendmsg.replyToQueueManagerName = queueManager;
//Constructing header
MQRFH2 rfh2 = new MQRFH2();
rfh2.setEncoding(MQConstants.MQENC_NATIVE);
rfh2.setCodedCharSetId(MQConstants.MQCCSI_INHERIT);
rfh2.setFormat(MQConstants.MQFMT_STRING);
rfh2.setNameValueCCSID(1208);
//adding message to header
rfh2.write(sendmsg);
//payload is the actual data which we want to send
byte[] messageBytes = payload.getBytes("UTF-8");
sendmsg.write(messageBytes);
//putting message to MQ
MQPutMessageOptions outputMsgOpt = new MQPutMessageOptions();
outputMsgOpt.options = MQConstants.MQPMO_FAIL_IF_QUIESCING |
MQConstants.MQPMO_DEFAULT_CONTEXT |
MQConstants.MQPMO_SYNCPOINT;
outputQueue.put(sendmsg, outputMsgOpt);
queueManager.commit();
这就是我稍后尝试检索它的方式:
MQMessage incomingMessage = new MQMessage();
byte[] incomingMessageId = incomingMessage.messageId;
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = MQConstants.MQGMO_FAIL_IF_QUIESCING |
MQConstants.MQGMO_CONVERT |
MQConstants.MQGMO_SYNCPOINT |
MQConstants.MQGMO_LOGICAL_ORDER |
MQConstants.MQGMO_ALL_MSGS_AVAILABLE |
MQConstants.MQGMO_WAIT;
inputQueue.get(incomingMessage, gmo);
MQRFH2 myRfh2 = new MQRFH2(incomingMessage); //this statement throws error with headers
完整的错误信息是:
com.ibm.mq.headers.MQDataException: MQJE001: Completion Code '2', Reason '2195'.
at com.ibm.mq.headers.MQDataException.getMQDataException(MQDataException.java:317)
at com.ibm.mq.headers.internal.Header.read(Header.java:620)
at com.ibm.mq.headers.MQRFH2.<init>(MQRFH2.java:113)
at com.simility.util.MQRfh2HeaderHelper.getMsgByteArray(MQRfh2HeaderHelper.java:16)
at com.simility.mq.SimilityMQBridge.main(SimilityMQBridge.java:182)
Caused by: com.ibm.mq.headers.MQDataException: MQJE001: Completion Code '2', Reason '6114'.
at com.ibm.mq.headers.MQDataException.getMQDataException(MQDataException.java:314)
at com.ibm.mq.headers.MQRFH2.read(MQRFH2.java:184)
at com.ibm.mq.headers.internal.Header.read(Header.java:639)
at com.ibm.mq.headers.internal.Header.read(Header.java:617)
... 3 more
Caused by: java.io.EOFException: MQJE086: End of file exception ('MQMessage.seek()').
at com.ibm.mq.MQMessage.seek(MQMessage.java:716)
at com.ibm.mq.headers.internal.store.MQMessageStore.readFrom(MQMessageStore.java:274)
at com.ibm.mq.headers.internal.Header.read(Header.java:661)
at com.ibm.mq.headers.MQRFH2.read(MQRFH2.java:181)
我验证的另一件事是“TotalMessageLength”的消息长度,并且在读取和写入消息之间匹配,但仍然会发生故障。
任何人都可以帮助我或指出与添加和检索带有 RFH2 标头的消息相关的正确方向吗?
【问题讨论】:
-
为什么要手动设置和读取 rfh2 标头?您正在设置的属性已在 MQMD 中设置。如果您想传递其他属性,请使用自 V7 以来 MQ 中的原始消息属性。
-
感谢您的回复。提供给我的完整有效负载结构专门要求设置 RFH2 标头。根据这个线程stackoverflow.com/questions/25906676/…,即使我意识到 MQMD 字段,但我的客户特别要求以这种格式发送消息。 1. MQMD 2. MQRFH2 3. 消息体
-
显然和Queue的PropertyControl有关。这个博客深入探讨了这个问题。 capitalware.com/rl_blog/?p=1168 如果我只是忽略 MQRFH2 标头,我就能正确读取消息。我将尝试更改队列的 propertyControl。但是,如果有人遇到过这个问题并想出了解决方案,请告诉我。
-
您不需要更改队列设置、您从 Roger 链接到的帖子,并且 IBM 手册显示您可以将
MQConstants.MQGMO_PROPERTIES_FORCE_MQRFH2添加到获取消息选项以完成相同的操作。跨度>