저는 최근에 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 헤더로 메시지를 추가 및 검색하는 것과 관련하여 나를 도와 주거나 올바른 방향으로 나를 가리킬 수 있습니까?
왜 수동으로 rfh2 헤더를 설정하고 읽으시겠습니까? 설정중인 속성은 이미 MQMD에 설정되어 있습니다. 다른 등록 정보를 전달하려는 경우 V7부터 MQ에서 순진한 메시지 등록 정보를 사용하십시오. – JoshMc
답장을 보내 주셔서 감사합니다. 나에게 주어진 완전한 페이로드 구조는 특별히 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
분명히 Queue의 PropertyControl과 관련이 있습니다. 이 블로그는이 문제에 대해 깊이 파고 들고 있습니다. http://www.capitalware.com/rl_blog/?p=1168 단순히 MQRFH2 헤더를 무시하면 메시지를 올바르게 읽을 수 있습니다. 나는 큐의 propertyControl을 변경하려고 시도 할 것이다. 그러나 누군가가이 문제에 직면하고 해결 방법을 알고 있다면 알려 주시기 바랍니다. – 0biwan