将RFH2标头添加到IBM MQ消息的正确方法是什么?

时间:2017-10-08 21:52:32

标签: ibm-mq rfh2

我最近开始使用IBM MQ(v7.5),目前正在开发类似服务的桥接器,以便在MQ和MQ之间进行双向数据传输。我有另一个REST服务。

通过使用标准API,我可以毫无问题地读取和写入消息。 但是当我开始为我的消息设置MQRFH2标头时,我面临的问题就出现了。在使用标题写入数据时我一定是犯了一些错误,因为每次我收到“文件结束异常('MQMessage.seek()')。”读取这些消息时出错。

将消息放入MQ时,这是我的代码片段:

//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标题添加和检索邮件相关的正确方向吗?

1 个答案:

答案 0 :(得分:0)

  

我验证的另一件事是&#34; TotalMessageLength&#34;的消息长度,   读取和写入消息之间的匹配,但仍然   失败发生了。

方法&#34; getMessageLength()&#34; MQMessage返回有效负载的数据长度?

为什么不尝试(在发件人中):

byte[] messageBytes = payload.getBytes();

如果您的数据不是相同的代码页或编码,那么让MQ完成工作而不是执行getBytes(&#34; UTF-8&#34;)。

即。将Encoding和CCSID设置为数据。

rfh2.setEncoding(???);
rfh2.setCodedCharSetId(???);