2017-10-08 48 views
0

私は最近IBM MQ(v7.5)で作業を開始しました。MQ &の別のRESTサービス。IBM MQメッセージにRFH2ヘッダーを追加する正しい方法は何ですか

標準の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. Message-Body – 0biwan

+0

明らかに、Queueの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(???); 
関連する問題