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.
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.
- 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
Ergebnisse
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;
}