2016-06-23 7 views
0

데드 레터 큐에서 메시지를 보내려합니다. 이를 위해, Dead Letter를 BytesMessage (Payload는 ZIP 또는 String 일 수 있음)로 변환해야합니다. MQ 클래스 (IBM)를 사용하여 Java의 BytesMessage로 데드 레터를 변환하는 방법

는 지금까지 시도하는 것 :

) (MQRFH2 클래스 RFH2를 확인하고 추구 :

 mqMessage.seek(0); MQRFH2 rfh2 = new MQRFH2(mqMessage); byte[] 
     data = new byte[mqMessage.getDataLength()]; 
     mqMessage.readFully(data); System.out.println("Message data: " 
     +new String(data));. 

MQHeaderlist에 의해 RFH2를 가져옵니다 :

 MQHeaderList list = new MQHeaderList (mqMessage, true); // Step 1. 
     MQDLH dlh = (MQDLH) list.get (0); // Step 2. 
     int reason = dlh.getReason(); // Step 3. 
     list.remove (dlh); // Step 4. 
     mqMessage = new MQMessage(); 
     list.write (mqMessage, true); // Step 5. 
     mqMessage.format = list.getFormat(); // Step 6. 

     MQHeaderIterator it = new MQHeaderIterator(mqMessage); 

     while (it.hasNext()) { 
      MQHeader header = it.nextHeader(); 

      System.out.println("Header type " + header.type() + ": " + header); 
     } 

MQRFH2 클래스 RFH2 받기 :

 MQHeader header = new MQRFH2(mqMessage); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     header.write(new DataOutputStream(out), CMQC.MQENC_NATIVE, 
     CMQC.MQCCSI_DEFAULT); byte[] bytes = out.toByteArray(); String 
     sout = new String(bytes); System.out.println(sout); 

Nothing 나는이 같은 오류를 얻을 : 나를 위해 일한

MQJE001: Beendigungscode '2', Ursache '6114'. 
MQJE001: Beendigungscode '2', Ursache '2195'. 
ch.coop.mid.hecol.DAEQHandler.exception.ZDAEQException: com.ibm.mq.headers.MQDataException: MQJE001: Beendigungscode '2', Ursache '2195'. 
    at ch.coop.mid.hecol.DAEQHandler.bl.impl.ZMQQueueImpl.resendAllLetters(ZMQQueueImpl.java:52) 
    at ch.coop.mid.hecol.DAEQHandler.ZStart.main(ZStart.java:20) 
Caused by: com.ibm.mq.headers.MQDataException: MQJE001: Beendigungscode '2', Ursache '2195'. 
    at com.ibm.mq.headers.MQDataException.getMQDataException(MQDataException.java:316) 
    at com.ibm.mq.headers.internal.Header.read(Header.java:620) 
    at com.ibm.mq.headers.MQRFH2.<init>(MQRFH2.java:113) 
    at ch.coop.mid.hecol.DAEQHandler.dto.ZMessageDTO.<init>(ZMessageDTO.java:60) 
    at ch.coop.mid.hecol.DAEQHandler.bl.impl.ZMQQueueImpl.resendAllLetters(ZMQQueueImpl.java:50) 
    ... 1 more 
Caused by: com.ibm.mq.headers.MQDataException: MQJE001: Beendigungscode '2', Ursache '6114'. 
    at com.ibm.mq.headers.MQDataException.getMQDataException(MQDataException.java:313) 
    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) 
    ... 4 more 
Caused by: java.io.EOFException: MQJE086: Ausnahmebedingung durch Dateiende ('MQMessage.seek()'). 
    at com.ibm.mq.MQMessage.seek(MQMessage.java:715) 
    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) 

작은 부분에 그들을 다시 함께 조립에 전체 메시지를 분할하지 않고 BytesMessage의에 죽은 편지를 변환하는 또 다른 방법이 있나요? 이 방법은 제 의견으로는 너무 아름답 지 않습니다. 그것은 매우 불안정합니다.

편집 : Java에서 mq 라이브러리의 버전 7.5.0.0 만 사용할 수 있습니다.

+0

왜 당신이 메시지를 다시 보내 죽은 편지 핸들러를 사용하지 않는 : 여기

는 코드를 보여야 어떻게? 다시 시도, 전달 등의 규칙을 설정할 수 있습니다. 자세한 정보는 다음 두 링크를 참조하십시오. http://www.ibm.com/support/knowledgecenter/SSKSK_7.5.0/com.ibm.mq.pla.doc/q005540_.htm http://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.ref.adm.doc/q083420_.htm – ValerieLampkin

+0

Java 어플리케이션에서 "문제점"을 해결해야하기 때.입니다. @ValerieLampkin –

답변

1

세계에서 무엇을하고 있습니까? 문제를 거꾸로 공격하고있는 것처럼 보입니다. 메시지 레이아웃은 MQDLH + MQRFH2 + 메시지 데이터입니다.

원본 대상 큐에 "MQRFH2 + 메시지 데이터"를 다시 보내고 싶다고 가정합니다.

mqMsg.seek(0); 
MQDLH dlh = new MQDLH(mqMsg); 
System.out.println("Reason code= "+dlh.getReason() + " : Dest. Queue Name="+dlh.getDestQName()); 

byte[] bData = new byte[mqMsg.getDataLength()]; 
mqMsg.readFully(bData); 

// Open the original destination queue 
int openOutputOptions = CMQC.MQOO_OUTPUT + CMQC.MQOO_FAIL_IF_QUIESCING; 
MQQueue outQ = _qMgr.accessQueue(dlh.getDestQName().trim(), 
            openOutputOptions, 
            dlh.getDestQMgrName().trim(), 
            null, 
            null); 

// Create a new message and set the values from DLH 
MQMessage newMsg = new MQMessage(); 
newMsg.characterSet = dlh.getCharacterSet(); 
newMsg.encoding  = dlh.getEncoding(); 
newMsg.format  = dlh.getFormat(); 

newMsg.write(bData); // write the data 

MQPutMessageOptions pmo = new MQPutMessageOptions(); 
pmo.options = CMQC.MQPMO_FAIL_IF_QUIESCING; 

// Put the message to the destination queue 
outQ.put(newMsg, pmo); 

outQ.close(); 
+0

그러나 이것은 MQMD 또는 다른 헤더를 복사하지 않습니다. –