2010-08-16 3 views
5

Ich sende Nachrichten an eine ferne Warteschlange, auf die ich keine Kontrolle habe.IBM MQ Nachrichtenkopf

ich eine XML-Datei als Nachricht senden, aber wenn die Anwendung die Nachricht liest bekommt er eine Nachricht Header wie

<mcd><Msd>jms_text</Msd></mcd> \0\0\0l<jms><Dst>queue:///TEST</Dst><Tms>1281475843707</Tms><Cid></Cid><Dlv>1</Dlv></jms> 

ich will nicht dieser Message-Header für das Senden dieser Nachricht vorhanden und meinen Code sein wie folgt:

Properties props = new Properties(); 
    props.setProperty("java.naming.factory.initial",this.initialFactory); 
    props.setProperty("java.naming.provider.url", url); 

    Context context = new InitialContext(props); 

    QueueConnectionFactory qcf = (QueueConnectionFactory) context.lookup(this.context); 
    qConn = qcf.createQueueConnection(); 
    queue = (Queue)context.lookup(name); 
    qSession = qConn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); 
    qConn.start(); 
      QueueSender send = qSession.createSender(queue); 
    String text = "My xml file"; 
    TextMessage tm = qSession.createTextMessage(text); 
    send.send(tm); 
    send.close(); 

Wie vermeide ich das?

Antwort

9

Es scheint, dass Sie eine JMS-Nachricht an ein non-jms-Ziel senden. Wie wird die Nachricht am Zielort konsumiert? Erwartet es eine native MQ-Nachricht? Der Empfänger versteht den MQRFH2-Header, der die JMS-Headereigenschaften speichert, nicht.

Sie sollten entweder das Ziel konfigurieren, um JMS zu verstehen, oder Sie können etwas wie folgt tun, um dem mq jms mitzuteilen, dass Ihr Empfänger ein Nicht-JMS-Client ist.

((com.ibm.mq.jms.MQQueue) queue).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ); 
+0

hey danke, versuchen Sie es und lassen Sie –

+0

wissen hey danke Kumpel, es funktioniert, ich habe es einfach versucht. Jetzt muss ich verstehen, was es bedeutet –

+0

Nun, da Sie einen Workaround im Code getan haben, anstatt das verwaltete Objekt einzustellen, bedeutet dies, dass alle anderen Apps oder Module, die JMS-Nachrichten an dieses Ziel senden, das gleiche Problem haben. Legen Sie sie in den verwalteten Objekten fest (.bindings-Datei, LDAP oder was auch immer) und sie wird ohne Code und in allen Apps, die dieses verwaltete Objekt verwenden, korrigiert. –

5

Werfen Sie einen Blick auf die Eigenschaften für JMS-Objekte as listed in the docs. Auf dem verwalteten Objekt befindet sich eine Eigenschaft namens TARGCLIENT, die auf 'MQ' gesetzt werden sollte. Obwohl Sie möglicherweise keine Kontrolle über das verwaltete Objekt haben, liegt es in der Verantwortung der Person, die die verwalteten Objekte verwaltet, diese Eigenschaft korrekt festzulegen. Wenn das Ziel die RFH2-Header nicht versteht (in WMQ v6 werden JMS-Eigenschaften gespeichert), müssen alle WMQ JMS-Anwendungen, die Nachrichten an dieses Ziel senden, diese Eigenschaft festlegen.

Übrigens deutet die Tatsache, dass Sie dieses Problem haben, darauf hin, dass die Anwendung, die Nachrichten verbraucht, immer noch auf v6 ist. Bitte beachten Sie, dass v6.0 von WMQ Ende September 2011 nicht mehr verfügbar ist. Wenn Sie nun sowohl auf der QMgr- als auch auf der Clientseite zu v7 wechseln, können Sie dies mit einfachen Einstellungen in der Warteschlange selbst verwalten. Die Legacy-App erkennt die Nachrichten unabhängig davon, ob sie an RFH2 angeschlossen sind, und die Client-App erkennt die Antworten als JMS-Nachrichten, unabhängig davon, ob die Legacy-App RFH2-Header hinzufügt. Wechseln Sie jetzt zu v7, ersparen Sie sich viel Mühe beim Entwickeln dieser App und vermeiden Sie auch, nächstes Jahr auf v7 migrieren zu müssen.

WMQ v7 Client-Downloads sind verfügbar here

aktualisieren: End-of-Life für WMQ V6 geschoben wurde 2012 bis September zurück