2017-10-08 75 views
0

我最近開始使用IBM MQ(v7.5)並且目前正在開發一個類似於服務的橋,用於MQ &之間的雙向數據傳輸我擁有的另一個REST服務。將RFH2頭添加到IBM MQ消息的正確方式是什麼

通過使用標準的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」的消息長度,並且在readin g並編寫消息,但仍然發生失敗。

任何人都可以請幫助我或指出我正確的方向與添加和檢索與RFH2頭信息相關?

+0

爲什麼要手動設置和讀取rfh2頭文件?您正在設置的屬性已經在MQMD中設置。如果您想傳遞其他屬性,請使用自V7以來MQ中天真的消息屬性。 – JoshMc

+0

謝謝你的回覆。給我的完整有效負載結構要求專門設置RFH2頭文件。按照這個線程https://stackoverflow.com/questions/25906676/how-to-read-values-out-of-the-websphrere-mq-mqmd-header-with-the-ibm-mq-librarie我甚至意識到關於MQMD字段,但我的客戶特別要求以此格式發送消息。 1. MQMD 2. MQRFH2 3.消息體 – 0biwan

+0

顯然它與隊列的PropertyControl有關。這個博客深入探討這個問題。 http://www.capitalware.com/rl_blog/?p=1168 如果我忽略MQRFH2標題,我能夠正確地閱讀這些消息。我將嘗試改變隊列的propertyControl。但如果有人遇到這個問題並想出解決方案,請讓我知道。 – 0biwan

回答

0

我驗證的另一件事是消息長度由「TotalMessageLength」, 和讀寫消息之間匹配,但仍 故障發生。

MQMessage的方法「getMessageLength()」是否返回有效負載的數據長度?

你爲什麼不嘗試(發件人):

byte[] messageBytes = payload.getBytes(); 

如果您的數據是不一樣的代碼頁或編碼然後讓MQ做的工作,而不是你做的getBytes(「UTF-8」 )。

即將編碼和CCSID設置爲數據的內容。

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