it-swarm.com.de

Verwendung von Java JMS mit MQseries

Ich versuche, ein JMS zu entwickeln eigenständige Anwendung zum Lesen und Schreiben in eine Warteschlange in MQSeries. Mein Chef hat mich gebeten, dafür pure Java JMS (nicht ibm.mq lib) zu verwenden.

Hier sind die Informationen, die zum Herstellen der JMS-Verbindung erforderlich sind:

  mq.hostname=10.10.10.10
  mq.channel=API.CLIENTCHL
  mq.queueManager=MQPETAPI
  mq.port=1422

Wissen Sie, wie das geht? Oder haben Sie einen Link, der mir das beibringt?.

31
David

Das Problem hierbei ist die Anforderung, dass "mein Chef mich gebeten hat, dafür reines Java JMS (nicht ibm.mq lib) zu verwenden." JMS ist eine Spezifikation, und jede Implementierung muss mit der API übereinstimmen Wenn Sie WebSphere MQ als Transport verwenden, müssen Sie daher IBM MQ verwenden, um die vom Transportanbieter bereitgestellten Implementierungsklassen zu verwenden JMS-Klassen zum Schreiben einer JMS-Anwendung.

Wenn Sie sich jedoch an reine JMS-API-Aufrufe halten, können Sie die Klassen aller Transportanbieter einbinden. Dies ist in der Regel beabsichtigt, wenn Sie Anforderungen wie die im ursprünglichen Beitrag genannten erhalten.

In einem Artikel wird genau beschrieben, was Sie tun möchten: Ausführen einer eigenständigen Java -Anwendung unter WebSphere MQ V6. Verwendet nur die JMS-API und JNDI in einem lokalen Dateisystem (einer .bindings-Datei). Wenn Sie die IBM JMS-Klassen gegen einen anderen Anbieter austauschen und deren JNDI-Tools verwenden, können Sie Plug-ins durchführen in jedem JMS-Transport, ohne Ihren Code mit diesem Ansatz zu ändern.

Wenn Sie dasselbe auch ohne JNDI ausführen möchten, sehen Sie sich die Beispielprogramme an, die mit der MQ-Client-Installation geliefert wurden, bei der Sie Ihre Java Klassen bezogen haben. In einem UNIX/Linux-System befinden sich diese in /opt/mqm/samp und unter Windows sind sie in install_dir/tools/jms/samples. Das SimpleRequestor.Java sample enthält den folgenden Code zum Initialisieren Ihrer Verbindungsfactory ohne JNDI:

try {
  // Create a connection factory
  JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
  JmsConnectionFactory cf = ff.createConnectionFactory();

  // Set the properties
  cf.setStringProperty(WMQConstants.WMQ_Host_NAME, "localhost");
  cf.setIntProperty(WMQConstants.WMQ_PORT, 1414);
  cf.setStringProperty(WMQConstants.WMQ_CHANNEL, "SYSTEM.DEF.SVRCONN");
  cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
  cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, "QM1");

Da bei diesem Ansatz kein JNDI verwendet wird, müssen Sie Code schreiben, der nicht zwischen Transportanbietern transportiert werden kann. Es ist IBM WebSphere MQ-spezifisch.

Wenn Sie die MQ-Gläser von irgendwoher geholt haben und nicht die vollständige Installation haben (und daher nicht die Beispiele haben), können Sie sie als SupportPac MQC7 herunterladen. Der Download ist kostenlos. Im Allgemeinen sollten Sie den neuesten Client verwenden, auch mit einem Warteschlangenmanager auf einer früheren Ebene. Natürlich erhalten Sie keine V7-Funktionalität von einem V6-QMgr, aber die JMS-Implementierung im V7-Client wurde erheblich verbessert, selbst für die V6-Funktionalität. Wenn Sie aus irgendeinem Grund den V6-Client wirklich verwenden müssen, können Sie ihn als SupportPacMQC6 herunterladen. Stellen Sie unabhängig von der verwendeten Client-Version sicher, dass Sie das entsprechende Infocenter verwenden.

V6 Infocenter
V7 Infocenter

Schließlich ist die Landing Page mit einem Index für alle SupportPacs hier .

48
T.Rob

Eine vollständige (synchrone) eigenständige JMS-Anwendung mit TextMessage.
Es ist IBM WebSphere MQ-spezifisch.

import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;

import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQQueueConnectionFactory;

public class JMSApplicationStandAlone {
    public static void main(String[] args) {
        try {
            /*MQ Configuration*/
            MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
            mqQueueConnectionFactory.setHostName("localhost");
            mqQueueConnectionFactory.setChannel("MQ.CHANNEL");//communications link
            mqQueueConnectionFactory.setPort(1416);
            mqQueueConnectionFactory.setQueueManager("QUEUE.MGR");//service provider 
            mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);

            /*Create Connection */
            QueueConnection queueConnection = mqQueueConnectionFactory.createQueueConnection();
            queueConnection.start();

            /*Create session */
            QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

            /*Create response queue */
            Queue queue = queueSession.createQueue("QUEUE.RESPONSE");


            /*Create text message */
            TextMessage textMessage = queueSession.createTextMessage("put some message here");
            textMessage.setJMSReplyTo(queue);
            textMessage.setJMSType("mcd://xmlns");//message type
            textMessage.setJMSExpiration(2*1000);//message expiration
            textMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT); //message delivery mode either persistent or non-persistemnt

            /*Create sender queue */
            QueueSender queueSender = queueSession.createSender(queueSession.createQueue("QUEUE.REQEST"));
            queueSender.setTimeToLive(2*1000);
            queueSender.send(textMessage);

            /*After sending a message we get message id */
            System.out.println("after sending a message we get message id "+ textMessage.getJMSMessageID());
            String jmsCorrelationID = " JMSCorrelationID = '" + textMessage.getJMSMessageID() + "'";


            /*Within the session we have to create queue reciver */
            QueueReceiver queueReceiver = queueSession.createReceiver(queue,jmsCorrelationID);


            /*Receive the message from*/
            Message message = queueReceiver.receive(60*1000);
            String responseMsg = ((TextMessage) message).getText();

            queueSender.close();
            queueReceiver.close();
            queueSession.close();
            queueConnection.close();


        } catch (JMSException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Hinweis: Ersetzen Sie die Konfigurationswerte

10
Premraj

Wenn es Ihnen nichts ausmacht, WMQ-spezifischen Code zu schreiben, können Sie dies tun

MQConnectionFactory cf = new MQConnectionFactory();
cf.setHostName(HOSTNAME);
cf.setPort(PORT);
cf.setChannel(CHANNEL);
cf.setQueueManager(QMNAME);
cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);

dann übliche JMS-Ressourcen

Connection c = cf.createConnection();
Session s = c.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue q = s.createQueue("myQueue"); // replace with real queue name
MessageProducer p = s.createProducer(q);

und schließlich erstellen und senden Sie eine Nachricht

Message m = s.createTextMessage("Hello, World!);
p.send(m);

(Ich habe das auf der Oberseite meines Kopfes eingetippt, kann also einen Tippfehler nicht ausschließen, aber es ist grundsätzlich korrekt). Wenn Sie wirklich 'reines JMS' verwenden sollen - dh ohne anbieterspezifische Objekte -, müssen Sie ein MQConnectionFactory-Objekt in JNDI binden (schauen Sie sich das JMSAdmin-Tool an, es befindet sich in den Dokumenten) und es dann nachschlagen aus Ihrer Anwendung, dh.

InitialContext ic = new InitialContext(); // or as appropraite
ConnectionFactory cf = (ConnectionFactory)ic.lookup("myMQfactory"); // replace with JNDI name
9
strmqm

In der Regel definieren Sie mit JMS das QueueConnectionFactory in Ihrem Container über den Konfigurationsmechanismus, den es zur Verfügung stellt, und fügen es dann der JNDI-Registrierung des Containers hinzu. Jeder Container verfügt dazu über eigene Methoden (d. H. Tomcat im Vergleich zu WebSphere).

Wenn Sie auf JNDI verzichten möchten, können Sie eine Instanz von com.ibm.mq.jms.MQQueueConnectionFactory direkt erstellen und den Hostnamen, den Port, den Warteschlangenmanager und die Kanaleigenschaften festlegen. Sie können dieses Objekt dann wie eine Instanz von javax.jms.QueueConnectionFactory Verwenden, da es es implementiert.

3
laz

Ich kann Ihnen JMS nicht in einem einzelnen Beitrag beibringen, aber ich kann Sie auf einige der Ressourcen verweisen, die ich verwendet habe, um es selbst zu lernen:

  1. Das O'Reilly Java Message Service Buch
  2. IBM Developerworks JMS Tutorial (mehr MQSeries/Websphere MQ-spezifisch)
  3. Das Spring-Framework kann Ihnen dabei helfen, JMS effektiver zu nutzen, insbesondere wenn Sie eine eigenständige App außerhalb eines J2EE-App-Servers entwickeln: Spring Java Message Service documentation
2
Kaypro II

Dies ist ziemlich häufig. hier sind einige Beispiele.

0
Preston