Unternehmensanwendung für die Verwendung von MDBs entwickeln

Anwendungen können MDBs (Message-driven Beans, nachrichtengesteuerte Beans) als asynchrone Nachrichtenkonsumenten verwenden. Sie implementieren eine Message-driven Bean als Nachrichtenlistener für ein Ziel. Die MDB wird von einer Aktivierungsspezifikation oder einem JMS-Listener aufgerufen, wenn eine Nachricht am Eingabeziel, das der Listener überwacht, ankommt.

Informationen zu diesem Vorgang

Eine Unternehmensanwendung, die eine MDB verwendet, wird genau wie eine Anwendung entwickelt, die andere Enterprise-Beans verwendet. Der einzige Unterschied besteht darin, dass eine MDB keine lokale oder ferne Schnittstelle hat.

Sie sollten die MDB so entwickeln, dass die Geschäftsprozesse ankommender Nachrichten an eine andere Enterprise-Bean delegiert werden, um eine klare Trennung von Nachrichten- und Geschäftsprozessen zu erreichen. Dies bedeutet auch, dass die Geschäftsprozesse bei der Ankunft eingehender Nachrichten oder beispielsweise durch einen WebSphere-J2EE-Client aufgerufen werden kann. Antworten können von einer weiteren Enterprise-Bean (Sender-Bean) oder innerhalb der MDB bearbeitet werden.

EJB-2.0-MDBs unterstützen nur JMS-Messaging (Java™ Message Service). MDBs der EJB Versionen 2.1 und 3 unterstützen zusätzlich zu JMS noch weitere Messaging-Typen. Alle Message-driven Beans müssen die Schnittstelle MessageDrivenBean implementieren. Für JMS-Messaging muss eine MDB außerdem die Nachrichtenlistenerschnittstelle javax.jms.MessageListener implementieren. Andere JCA-kompatible (Java EE Connector Architecture) Ressourcenadapter können eigene Nachrichtenlistenerschnittstellen bereitstellen, die implementiert werden müssen.

Sie können den Assistenten Neue Enterprise-Bean von Rational Application Developer verwenden, um eine Enterprise-Bean mit dem Bean-Typ Message-driven Bean zu erstellen. Der Assistent erstellt die dem Bean-Typ entsprechenden Methoden.

Gemäß Konvention wird die MDB-Klasse NameBean genannt. Name steht hier für den Namen, den Sie der Message-driven Bean zuordnen. Beispiel:
public class MyJMSppMDBBean implements MessageDrivenBean, javax.jms.MessageListener

Eine MDB kann bei einem EJB-Zeitgeberservice für zeitbasierte Ereignisbenachrichtigungen registriert werden, wenn sie zusätzlich die Schnittstelle javax.ejb.TimedObject implementiert und die Callback-Methode für Zeitgeber "void ejbTimeout(Timer)" wie folgt aufruft: void ejbTimeout(Timer). Zur geplanten Zeit ruft der Container die Methode ejbTimeout der MDB auf.

Die Klasse für MDBs muss die folgenden Methoden definieren und implementieren:
  • Methode onMessage(message), die die folgenden Anforderungen erfüllen muss:
    • Die Methode muss ein Argument des Typs javax.jms.Message haben.
    • Die Klausel throws darf keine Anwendungsausnahmen festlegen.
    • Wenn die MDB für die Verwendung Bean-gesteuerter Transaktionen konfiguriert wird, muss Sie die Schnittstelle javax.transaction.UserTransaction aufrufen, um den Transaktionsbereich festzulegen. Da diese Aufrufe innerhalb der Methode onMessage() erfolgen, umfasst der Transaktionsbereich nicht den Empfang der ersten Nachricht. Weitere Informationen finden Sie im Artikel zur Transaktionsunterstützung für nachrichtengesteuerte Beans.

    Für die Bearbeitung der Nachricht innerhalb der Methode onMessage() (z. B. für die Übergabe der Nachricht an eine weitere Enterprise-Bean) müssen Sie Standard-JMS verwenden. Dies wird auch als Bean-managed Messaging bezeichnet.

    Wenn Sie einen JCA-konformen Ressourcenadapter mit einer anderen Nachrichtenlistenerschnittstelle verwenden, müssen Sie unter Umständen neben onMessage() noch eine weitere Methode verwenden. Nähere Informationen zu erforderlichen Nachrichtenlistenerschnittstelle finden Sie in der Dokumentation, die Sie zu Ihrem JCA-kompatiblen Ressourcenadapter erhalten haben.

  • Methode ejbCreate()

    Sie müssen für jede gewünschte Art der Erstellung einer neuen Instanz einer Enterprise-Bean eine Methode ejbCreate definieren und implementieren.

  • ejbRemove()

    Diese Methode wird vom Container aufgerufen, wenn ein Client die über die Home-Schnittstelle der Enterprise-Bean von der Schnittstelle javax.ejb.EJBHome geerbte remove-Methode aufruft. Diese Methode muss den gesamten Code enthalten, der vor dem Entfernen einer Enterprise-Bean-Instanz aus dem Container (und der zugeordneten Daten aus der Datenquelle) ausgeführt werden soll.

  • ejbTimeout(Timer)

    Diese Methode ist nur die Unterstützung von Benachrichtigungen des Zeitgeberservice erforderlich und enthält die Geschäftslogik, die empfangene zeitbasierte Ergebnisse verarbeitet.

Vorgehensweise

  1. Erstellen Sie das Projekt für die Unternehmensanwendungsprojekt.
  2. Erstellen Sie die MDB-Klasse. Sie können den Assistenten Neue Enterprise-Bean von Rational(r) Application Developer verwenden, um eine Enterprise-Bean mit dem Bean-Typ Message-driven Bean zu erstellen.

    Ein Beispiel für die Erstellung der MDB-Klasse finden Sie im Beispielabschnitt dieses Artikels. Weitere Informationen finden Sie unter Creating message-driven beans im Information Center von Rational Application Developer.

    Das Ergebnis dieses Schrittes ist eine MDB, die für die Implementierung in einer EAR-Datei assembliert werden kann.
  3. Optional: Verwenden Sie den Editor für EJB-Implementierungsdeskriptoren, um die Implementierungsattribute zu prüfen und gegebenenfalls zu ändern. Sie können den Editor für EJB-Implementierungsdeskriptoren verwenden, um Implementierungseigenschaften, die Sie im Assistenten für die Erstellung von EJBs angegeben haben (wie z. B. Transaktionstyp und Nachrichtenselektor) sowie andere Standardimplementierungsattribute zu überprüfen.

    Bei Bedarf können Sie die Werte dieser Eigenschaften später nach dem Export der Unternehmensanwendung in eine EAR-Datei überschreiben. Diesbezügliche Informationen finden Sie in den Artikeln Implementierungsattribute für eine Message-driven Bean für JCA-1.5-kompatible Ressourcen konfigurieren und Implementierungsattribute für eine Message-driven Bean für einen Listener-Port konfigurieren.

    1. Wählen Sie im Eigenschaftsfenster das Register Bean aus.
    2. Konfigurieren Sie in der Hauptanzeige das Attribut Transaktionstyp.
      Transaktionstyp
      Dieses Attribut bestimmt, ob die Message-driven Bean ihre eigenen Transaktionen verwaltet oder ob der Container die Transaktionen für die Bean verwaltet.
      Bean
      Die MDB verwaltet ihre eigenen Transaktionen.
      Container
      Der Container verwaltet Transaktionen für die Bean.
    3. Überprüfen Sie die folgenden Attribute unter Aktivierungskonfiguration:
      acknowledgeMode
      Dieses Attribut bestimmt, wie die Sitzung empfangene Nachrichten bestätigt.
      Automatische Bestätigung
      Die Sitzung bestätigt automatisch die Zustellung jeder Nachricht.
      Zulässigkeit doppelter Nachrichten bestätigen
      Die Sitzung bestätigt die Zustellung von Nachrichten bei Bedarf. Diese Einstellung führt wahrscheinlich zur doppelten Zustellung von Nachrichten, wenn JMS ausfällt. Diese Einstellung sollte deshalb nur von Konsumentenanwendungen genutzt werden, die doppelte Nachrichten tolerieren können.

      Wie in der EJB-Spezifikation definiert, können Clients die Methode Message.acknowledge() nicht zum Bestätigen von Nachrichten verwenden. Wenn der Wert CLIENT_ACKNOWLEDGE im Aufruf 'createxxxSession' übergeben wird, werden Nachrichten automatisch vom Anwenddungsserver bestätigt und die Methode Message.acknowledge() wird nicht verwendet.

      Anmerkung:

      Die Bestätigung wird gesendet, wenn die Nachricht gelöscht wird.

      Wenn Sie eine nicht transaktionsorientierte Message-driven Bean (MDB) haben, löscht das System die Nachricht beim Start oder bei Beendigung der Message-driven Bean. Wenn die Message-driven Bean eine Ausnahme generiert und deshalb nicht beendet wird, führt das System eine der folgenden Aktionen aus:
      • Wenn das System so konfiguriert ist, dass die Nachricht bei Beendigung der Message-driven Bean gelöscht wird, wird die Nachricht einer neuen Instanz der Message-driven Bean zugestellt, sodass es eine neue Gelegenheit zur Verarbeitung der Nachricht gibt.
      • Wenn das System so konfiguriert ist, dass die Nachricht beim Start der Message-driven Bean gelöscht wird, geht die Nachricht verloren.

      Die Nachricht wird beim Start der Message-driven Bean gelöscht, wenn die Servicequalität auf Bestmöglich, nicht persistent gesetzt ist. Bei allen anderen Servicequalitäten wird die Nachricht bei Beendigung der Message-driven Bean gelöscht.

      destinationType
      Dieses Attribut bestimmt, ob die Message-driven Bean ein Warteschlangen- oder Topicziel verwendet.
      Queue
      Die Message-driven Bean verwendet ein Warteschlangenziel.
      Topic
      Die Message-driven Bean verwendet ein Topicziel.
      subscriptionDurability
      Dieses Attribut bestimmt, ob eine JMS-Topicsubskription permanent ist.
      Permanent
      Ein Subskribent registriert eine permanente Subskription mit einer eindeutigen ID, die von JMS gespeichert wird. Nachfolgende Subskribentenobjekte mit derselben ID nehmen die Subskription in dem Status wieder auf, in dem es der vorherige Subskribent verlassen hat. Falls es für eine permanente Subskription keinen aktiven Subskribenten gibt, bewahrt der JMS die Subskriptionsnachrichten auf, bis sie vom Subskribenten empfangen wurden oder verfallen sind.
      Nicht permanent
      Nicht permanente Subskriptionen existieren über die gesamte Lebensdauer der entsprechenden Subskribentenobjekte. Das bedeutet, ein Client sieht die zu einem Topic veröffentlichten Nachrichten nur, solange der entsprechende Subskribent aktiv ist. Ist der Subskribent nicht aktiv, entgehen dem Client die zu diesem Topic veröffentlichten Nachrichten.

      Ein nicht permanenter Subskribent kann nur in dem Transaktionskontext (z. B. einem globalen oder nicht angegebenen Transaktionskontext) angegeben werden, der bei der Erstellung des Subskribenten vorhanden war.

      messageSelector
      Dieses Attribut bestimmt den JMS-Nachrichtenselektor, der verwendet wird, um die Nachrichten auszuwählen, die die Message-driven Bean empfängt. Beispiel:
      JMSType='car' AND color='blue' AND weight>2500

      Die Selektorzeichenfolge kann sich auf Felder im JMS-Nachrichtenkopf und Felder in den Nachrichteneigenschaften beziehen. Nachrichtenselektoren können nicht auf Werte im Nachrichtenhauptteil verweisen.

    4. Geben Sie Implementierungsattribute für die Bindungen an.

      Wählen Sie unter WebSphere-Bindungen die Option JCA-Adapter aus und geben Sie anschließend die Implementierungsattribute für die Bindung an.

      JNDI-Name der Aktivierungsspezifikation
      Dieses Attribut gibt den JNDI-Namen der Aktivierungsspezifikation an, die für die Implementierung der Message-driven Bean verwendet wird. Dieser Name muss mit dem Namen einer Aktivierungsspezifikation übereinstimmen, die Sie für WebSphere Application Server definieren.
      ActivationSpec Authorization Alias
      Dieses Attribut gibt den Namen eines Authentifizierungsalias an, der für die Authentifizierung von Verbindungen zum JCA-Ressourcenadapter verwendet wird. Ein Authentifizierungsalias gibt die Kombination aus Benutzer-ID und Kennwort an, die für die Authentifizierung einer neuen Verbindung mit dem JCA-Ressourcenadapter verwendet wird.
      JNDI-Name des Ziels
      Dieses Attribut gibt den JNDI-Namen an, den die MDB verwendet, um das JMS-Ziel im JNDI-Namespace zu suchen.
    5. Optional: Geben Sie den Ziellink an, um die Nachrichtenlinks zu aktivieren.

      Mit Hilfe von Nachrichtenlinks können Nachrichten an eine bestimmte MDB (Message-driven Bean) in einer Implementierung weitergeleitet werden. Mit Nachrichtenlinks kann der Nachrichtenfluss zwischen Komponenten in der derselben Anwendung koordiniert werden.

      Damit eine Nachricht von einer MDB (Message-driven Bean) gelesen und verarbeitet werden kann, muss das Element <message-destination-link> im zugehörigen Implementierungsdeskriptor der MDB definiert sein. Das Ziel, das mit dem Element <message-destination-link> angegeben wird, muss dem logischen Ziel entsprechen.

      Wenn <message-destination-ref> ein Element des Typs <message-destination-link> enthält, werden Nachrichten an diesem Ziel konsumiert.

      Damit die MDB die an ein Ziel gesendeten Nachrichten konsumiert, müssen Sie ein Element des Typs <message-destination-link> im Implementierungsdeskriptor deklarieren oder dieses in der Aktivierungsspezifikation angeben.

  4. Assemblieren und packen Sie die Anwendung für die Implementierung.

Ergebnisse

Mit dieser Task haben Sie eine EAR-Datei mit der MDB für die Unternehmensanwendung erstellt, die in WebSphere Application Server implementiert werden kann.

Beispiel

Das folgende Beispiel veranschaulicht, wie die MDB-Klasse erstellt wird. Der folgende Beispielcode zeigt, wie auf den Text und die JMS MessageID aus einer JMS-Nachricht des Typs TextMessage zugegriffen wird. In diesem Beispiel wird zunächst die Methode onMessage() einer Message-driven Bean (MDB) verwendet, um die ankommende Textnachricht zu entpacken und den Text und die Nachrichten-ID zu extrahieren. Anschließend wird eine private (innerhalb derselben Message-Bean-Klasse definierte) Methode putMessage verwendet, um die Nachricht in eine andere Warteschlange zu stellen:

public void onMessage(javax.jms.Message msg)
{
        String text      = null;
        String  messageID                 = null;

        try
        {
                text = ((TextMessage)msg).getText();

                System.out.println("senderBean.onMessage(), Nachrichtentext 2: "+text);

                //
                //Speichern der Nachrichten-ID als Korrelationswert
                //
                messageID = msg.getJMSMessageID();

                //Aufrufen der privaten Methode, um die Nachricht in eine andere Warteschlange zu stellen
                putMessage(messageID, text);
        }
        catch  (Exception err)
        {
                err.printStackTrace();
        }
        return;
}

Nächste Schritte

Nachdem Sie eine Unternehmensanwendung für die Verwendung von MDBs entwickelt haben, müssen Sie die Anwendung konfigurieren und implementieren. Definieren Sie beispielsweise Aktivierungsspezifikationen für die MDBs, und ändern Sie bei Bedarf die Attribute des Implementierungsdeskriptors für die Anwendung. Weitere Informationen hierzu finden Sie in den Artikeln Unternehmensanwendung für die Verwendung von Message-driven Beans mit JCA-1.5-kompatiblen Ressourcen implementieren und Unternehmensanwendung implementieren, die Message-driven Beans (MDBs) mit Listener-Ports verwendet.

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=tmb_devap
Dateiname:tmb_devap.html