Unternehmensanwendung für die Verwendung von JMS entwickeln

Mit dieser Task können Sie eine Unternehmensanwendung für die direkte Verwendung der JMS-API für das asynchrone Messaging entwickeln.

Informationen zu diesem Vorgang

Dieser Abschnitt gibt einen Überblick über die Schritte, die Sie ausführen müssen, wenn Sie eine Unternehmensanwendung (Servlet oder Enterprise-Bean) für die direkte Verwendung der JMS-API für das asynchrone Messaging entwickeln möchten.

Hier werden nur JMS-spezifische Aspekte beschrieben. Mit der generellen Programmierung von Unternehmensanwendungen sollten Sie bereits vertraut sein. Ausführliche Informationen zu diesen Schritten und Beispiele für die Entwicklung einer Unternehmensanwendung, die JMS verwendet, finden Sie in der Dokumentation zu Java™ Message Service.

Details der von Unternehmensanwendungen verwendeten JMS-Ressourcen sind in WebSphere Application Server definiert und werden von der Verwaltungsunterstützung von WebSphere Application Server in den JNDI-Namespace eingebunden.

Führen Sie zur Verwendung von JMS die folgenden allgemeinen Schritte aus:

Vorgehensweise

  1. JMS-Pakete importieren. Eine Unternehmensanwendung, die JMS verwendet, beginnt mit einer Reihe wichtiger Anweisungen für JMS, zu denen mindestens die folgenden gehören sollten:
    import javax.jms.*;       //JMS-Schnittstellen
    import javax.naming.*;    //Für JNDI-Suche nach verwalteten Objekten verwendet
  2. Ausgangskontext anfordern:
       try     {
            ctx = new InitialContext(env);
    ...
  3. Verwaltete Objekte aus dem JNDI-Namespace abrufen. Die Methode "InitialContext.lookup()" wird verwendet, um verwaltete Objekte (eine JMS-Verbindungsfactory und JMS-Ziele) abzurufen. Das folgende Beispiel veranschaulicht, wie eine Nachricht aus einer Warteschlange empfangen wird:
           qcf = (QueueConnectionFactory)ctx.lookup( qcfName );
    ...
           inQueue = (Queue)ctx.lookup( qnameIn );
    ...
    Eine alternative, aber weniger einfach zu verwaltende Lösung für das Abrufen administrativ definierter JMS-Zielobjekte durch eine JNDI-Lookup-Operation ist die Verwendung der Methode Session.createQueue(String) oder die Methode Session.createTopic(String). Beispiel:
    Queue q = mySession.createQueue("Q1");
    Erstellt eine JMS-Warteschlangeninstanz, mit der auf das vorhandene Ziel Q1 verwiesen werden kann.

    In seiner einfachsten Form ist der Parameter für create-Methoden der Name eines vorhandenen Ziels. Für komplexere Situationen können Anwendungen ein URI-basiertes Format verwenden, in dem eine beliebige Anzahl von Name/Wert-Paaren für verschiedene Eigenschaften des JMS-Zielobjekts angegeben werden kann.

  4. Verbindung zum Messaging Service Provider herstellen. Die Verbindung ermöglicht den Zugriff auf den zugrunde liegenden Transportmechanismus und wird für das Erstellen von Sitzungen verwendet. Die Verbindung wird mit der Methode createQueueConnection() des Factory-Objekts erstellt.
           connection = qcf.createQueueConnection();
    Die JMS-Spezifikation legt fest, dass Verbindungen im Stoppstatus erstellt werden müssen. Bis zum Start der Verbindung können die der Verbindung zugeordneten MessageConsumers keine Nachrichten empfangen. Setzen Sie zum Starten der Verbindung den folgenden Befehl ab:
           connection.start();
  5. Sitzung für das Senden/Empfangen von Nachrichten erstellen. Die Sitzung stellt einen Kontext für das Produzieren und Konsumieren von Nachrichten bereit, der auch die Methoden für das Erstellen von MessageProducers und MessageConsumers beinhaltet. Zum Abrufen einer Sitzung wird auf die Verbindung die Methode createQueueSession angewendet. Diese Methode verwendet zwei Parameter:
    • Ein boolescher Wert, der festlegt, ob die Sitzung eine Transaktionssitzung ist.
    • Ein Parameter, der den Bestätigungsmodus festlegt.
           boolean transacted = false;
           session = connection.createQueueSession( transacted,
                                                   Session.AUTO_ACKNOWLEDGE);

    In diesem Beispiel ist die Sitzung keine Transaktionssitzung. Der Empfang von Nachrichten wird automatisch bestätigt. Bei Verwendung dieser Einstellungen wird eine Nachricht nur zurückgesetzt, wenn ein Systemfehler auftritt oder die Anwendung unerwartet beendet wird.

    Für die Optionen gelten die folgenden Punkte gemäß EJB-Spezifikation:
    • Die mit createQueueSession übergebene Option transacted wird innerhalb einer globalen Transaktion ignoriert. Alle Arbeitsschritte werden im Rahmen der Transaktion ausgeführt. Außerhalb einer Transaktion wird die Option transacted verwendet. Ist diese Option auf true gesetzt, sollte die Anwendung die Ausführung der Arbeitsschritte mit session.commit() und session.rollback() steuern. Ist die Option "transacted" in einem EJB-2.0-Modul auf true gesetzt und außerhalb einer XA-Transaktion definiert, ist die Sitzung Teil der lokalen WebSphere-Transaktion. Das nicht aufgelöste Aktionsattribut der Methode wird auf die JMS-Arbeitsschritte angewendet, vorausgesetzt, diese werden von der Anwendung nicht festgeschrieben oder rückgängig gemacht.
    • Clients können Message.acknowledge() nicht zum Bestätigen von Nachrichten verwenden. Wird an den Aufruf createxxxSession der Wert CLIENT_ACKNOWLEDGE übergeben, werden Nachrichten automatisch vom Anwendungsserver bestätigt. Message.acknowledge() wird in diesem Fall nicht verwendet.
  6. Eine Nachricht senden.
    1. MessageProducers für das Erzeugen von Nachrichten erstellen. Für das Punkt-zu-Punkt-Messaging ist der MessageProducer ein QueueSender, der durch das Übergeben eines (zuvor abgerufenen) Ausgabewarteschlangenobjekts an die Methode createSender der Sitzung erstellt wird. Ein QueueSender wird normalerweise für eine bestimmte Warteschlange erstellt, sodass alle Nachrichten mit diesem Absender an dieselbe Zieladresse gesendet werden.
             QueueSender queueSender = session.createSender(inQueue);
    2. Die Nachricht erstellen. Erstellen Sie in der Sitzung eine leere Nachricht, und fügen Sie die übergebenen Daten hinzu.

      JMS bietet mehrere Nachrichtentypen an, die jeweils gewisse Informationen zum Inhalt der Nachricht haben. Um die Referenz auf lieferantenspezifische Klassennamen für die Nachrichtentypen zu vermeiden, werden dem Session-Objekt für Nachrichtenerstellung Methoden zur Verfügung gestellt.

      In diesem Beispiel wird von der Eigenschaft "outString" eine Textnachricht erstellt:
             TextMessage outMessage = session.createTextMessage(outString);
    3. Die Nachricht senden.
      Zum Senden wird die Nachricht an die send-Methode des QueueSender übergeben:
             queueSender.send(outMessage);
  7. Antworten empfangen.
    1. Erstellen Sie die Korrelations-ID zur Verknüpfung der gesendeten Nachricht mit den Antworten. In diesem Beispiel kann der Client dank der providerspezifischen Nachrichten-ID in einer JMSCorrelationID Antworten auf die von ihm gesendete Nachricht empfangen.
             messageID = outMessage.getJMSMessageID();
      Die Korrelations-ID wird dann in einem Message Selector verwendet, um nur Nachrichten mit dieser ID auszuwählen:
             String selector = "JMSCorrelationID = '"+messageID+"'";
    2. Erstellen Sie einen Nachrichtenempfänger für den Nachrichtenempfang. Für das Punkt-zu-Punkt-Messaging ist der MessageReceiver ein QueueReceiver, der durch das Übergeben eines (zuvor abgerufenen) Eingabewarteschlangenobjekts und des Message Selector an die Methode createReceiver der Sitzung erstellt wird.
             QueueReceiver queueReceiver = session.createReceiver(outQueue, selector);
    3. Rufen Sie die Antwortnachricht ab. Für das Abrufen einer Antwort wird die receive-Methode des QueueReceiver verwendet:
             Message inMessage = queueReceiver.receive(2000);

      Der Parameter im Aufruf von receive ist ein Zeitlimit in Millisekunden. Dieser Parameter definiert, wie lange die Methode warten soll, falls nicht sofort eine Nachricht verfügbar ist. Wenn Sie diesen Parameter nicht verwenden, führt der Aufruf zu einer unbegrenzten Blockierung. Wenn Sie keine Verzögerung wünschen, verwenden Sie die Methode receiveNoWait(). In diesem Beispiel kehrt der Aufruf von receive beim zuerst eintretenden der beiden folgenden Ereignisse zurück: beim Eintreffen der Nachricht oder nach Ablauf von 2000 ms.

    4. Bearbeiten Sie die empfangene Nachricht. Wenn Nachrichten empfangen werden, können Sie mit diesen gemäß den Anforderungen der Geschäftslogik des Client verfahren. Zu den allgemeinen JMS-Aktionen gehört das Überprüfen des Nachrichtentyps und das Extrahieren des Nachrichteninhaltes. Wenn Sie den Inhalt aus dem Hauptteil der Nachricht extrahieren möchten, müssen Sie eine Umsetzung von der generischen Message-Klasse (dem deklarierten Rückgabetyp der receive-Methoden) auf eine mehr spezifische Unterklasse vornehmen, z. B. auf TextMessage. Sie sollten es sich zur Gewohnheit machen, vor der Umsetzung stets die Nachrichtenklasse zu testen, um bei unerwarteten Fehlern gewappnet zu sein.

      In diesem Beispiel wird mit dem Operator instanceof überprüft, ob die empfangene Nachricht eine Nachricht des Typs TextMessage ist. Anschließend wird der Nachrichteninhalt durch Umsetzung auf die Unterklasse TextMessage extrahiert.

             if ( inMessage instanceof TextMessage )
      
      ...
                 String replyString = ((TextMessage) inMessage).getText();
  8. Abschluss. Wenn die Anwendung viele kurzlebige JMS-Objekte auf Sitzungsebene oder einer niedrigeren Ebene erstellen muss, ist es wichtig, dass alle verwendeten JMS-Ressourcen geschlossen werden. Rufen Sie dazu für die verschiedenen Klassen (QueueConnection, QueueSession, QueueSender und QueueReceiver) die Methode close() auf, wenn die Ressourcen nicht mehr benötigt werden.
           queueReceiver.close();
    ...
           queueSender.close();
    ...
           session.close();
           session = null;
    ...
           connection.close();
           connection = null;
  9. Nachrichten veröffentlichen und abonnieren. Wenn Sie anstelle des Punkt-zu-Punkt-Messaging die JMS-Publish/Subscribe-Unterstützung verwenden möchten, sind die allgemeinen Aktionen, z. B. für das Erstellen einer Sitzung und einer Verbindung, dieselben. Abweichend werden an Stelle von Warteschlangenressourcen Topicressourcen verwendet (z. B. TopicPublisher an Stelle von QueueSender). Sehen Sie sich dazu das folgende Beispiel für das Publizieren einer Nachricht an:
    // TopicPublisher erstellen
           TopicPublisher pub = session.createPublisher(topic);
    ...
           pub.publish(outMessage);
    ...
           //Schließen des TopicPublisher
           pub.close();
  10. Fehler behandeln JMS-Laufzeitfehler werden durch Ausnahmen gemeldet. Die Mehrzahl der Methoden löst in JMS JMSExceptions aus, um Fehler anzuzeigen. Sie sollten es sich zur Gewohnheit werden lassen, diese Ausnahmen abzufangen und in einer geeigneten Ausgabe anzuzeigen.

    Im Gegensatz zu normalen Java-Ausnahmen kann eine JMSException weitere eingebettete Ausnahmen enthalten. Die Implementierung von JMSException schließt die eingebettete Ausnahme nicht in die Ausgabe der Methode toString() ein. Sie müssen daher explizit prüfen, ob eine eingebettete Ausnahme vorhanden ist und diese dann wie im folgenden Beispiel gezeigt ausgeben:

        catch (JMSException je)
        {
           System.out.println("JMS gescheitert mit "+je);
           Exception le = je.getLinkedException();
           if (le != null)
           {
               System.out.println("Verknüpfte Ausnahme "+le);
           }
        }

Nächste Schritte

Nachdem Sie Ihr Anwendungspaket erstellt haben, können Sie die Anwendung in WebSphere Application Server implementieren. Lesen Sie dazu die Informationen im Abschnitt Unternehmensanwendung für die Verwendung von JMS implementieren.

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tmj_devap
Dateiname:tmj_devap.html