2016-06-23 4 views
0

Je souhaite renvoyer un message à partir d'une file d'attente de lettres mortes. Pour cela, j'ai besoin de convertir la lettre morte en un BytesMessage (la charge utile peut être un ZIP ou une chaîne).Comment convertir une lettre morte en un BytesMessage dans Java à l'aide de classes MQ (IBM)

Ce que j'essayé jusqu'à présent:

Get RFH2 par classe MQRFH2 et seek():

 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));. 

Obtenez RFH2 par MQHeaderlist:

 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); 
     } 

Get RFH2 par classe MQRFH2:

 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); 

Rien a marché pour moi: je reçois des erreurs, comme celui-ci:

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) 

Y at-il une autre façon de convertir une lettre morte à un BytesMessage sans diviser l'ensemble des messages pour petites parties un les assembler de nouveau ensemble? Cette façon n'est pas très belle à mon avis. C'est très instable.

EDIT: Je ne peux utiliser que la version 7.5.0.0 des bibliothèques mq dans java.

+0

Pourquoi vous n'utilisez le gestionnaire de lettre morte pour renvoyer des messages? Vous pouvez configurer des règles pour réessayer, transférer, etc. Voir ces 2 liens pour plus d'informations http://www.ibm.com/support/knowledgecenter/SSFKSJ_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

Parce que j'ai besoin de résoudre le "problème" avec une application Java. @ValerieLampkin –

Répondre

1

Que faites-vous dans le monde? Vous semblez attaquer le problème à l'envers. La disposition des messages est MQDLH + MQRFH2 + données de message. Je suppose que vous voulez renvoyer les «données de message MQRFH2 +» à la file d'attente de destination d'origine.

Voici comment votre code doit:

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

Mais cela ne copie pas le MQMD ou d'autres en-têtes? ' –