2017-10-08 9 views
0

저는 최근에 IBM MQ (v7.5)로 작업을 시작했으며 MQ & 다른 REST 서비스 사이의 양방향 데이터 전송을 위해 현재 서비스와 같은 브리지에서 작업하고 있습니다. .IBM MQ 메시지에 RFH2 헤더를 추가하는 올바른 방법은 무엇입니까

표준 API를 사용하여 아무런 문제없이 메시지를 읽고 쓸 수 있습니다. 하지만 내가 직면하고있는 문제는 메시지에 MQRFH2 헤더를 설정하기 시작했을 때입니다. 나는 "End of file 예외 ('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(???);