Java Enterprise: Enterprise Java Beans
Allgemein
BearbeitenEnterprise Java Beans [EJB] sind standardisierte Komponenten innerhalb eines J2EE-Servers. Sie vereinfachen die Entwicklung komplexer mehrschichtiger verteilter Softwaresysteme in Java. Enterprise Java Beans gibt es in mehreren unterschiedlichen Ausprägungen für verschiedene Klassen von Anwendungsfällen:
- EntityBeans - persistente Business Objekte
- SessionBeans - Business Fachlogik Objekte
- MessageDrivenBeans - Objekte für asynchrone Business Logik
Zugriff auf Objekte
BearbeitenWährend in der Standardedition meist das Schlüsselwort new oder Factory Methoden zum Erhalt eines Objektes Verwendung finden, wird im Applicationserverumfeld ein Objekt über einen Namensdienst bereitgestellt. Dies kann z.B. über JNDI, CORBA oder RMI over IIOP erfolgen. Der Applicationserver generiert hierbei die Stub und Skeleton Objekte.
CORBA Beispiel:
orb.omg.CORBA.Object objectReference = orb.resolve_initial_reference ("NameService"); NamingContext namingContext = NamingContextHelper.narrow (objectReference); NameComponent nameComponent = new NameComponent ("Beispiel", ""); NameComponent pfad [] = {nameComponent}; Beispiel bsp = BeispielHelper.narrow (namingContext.resolve (pfad));
RMI Beispiel:
Beispiel bsp = (Beispiel) Naming.lookup ("rmi://127.0.0.1/Beispiel");
Die EJB Komponenten haben grundsätzlich vollen Zugriff auf die Dienste des Containers und werden von diesem verwaltet (z.B. Instance Pooling, Instance Swapping). Sie unterteilen sich hierbei zuerst in folgende Java Typen:
Session Bean
BearbeitenSession-Beans übernehmen die serverseitigen Aufgaben und bilden Geschäftsprozesse ab. Sie bedienen sich häufig mehrerer EntityBeans, um die Auswirkungen des Prozesses darzustellen. Ein SessionBean ist vom Typ javax.ejb.SessionBean
.
Man unterscheidet zustandslose ("stateless") und zustandsbehaftete ("stateful") Session-Beans. Der Zustand einer Stateless Session Bean ist abhängig vom Aufruf einer Methode der Bean durch einen Client. Wenn die Verbindung zwischen Client und Stateless Session Bean beendet wird, gehen die Werte der Instanzvariablen verloren. Das bedeutet, dass der Zustand der Bean nicht an einen Client gebunden ist. Jeder Methodenaufruf durch einen beliebigen Client hinterlässt die Bean in dem selben Zustand. Laut Java Dokumentation benötigt eine Applikation weniger Stateless Session Beans als Stateful Session Beans um dieselbe Anzahl an Clients zu bedienen, da sich Stateless Session Beans besser skalieren lassen.
Beispiel code für EJB 3.0 (Interface)
@Remote public interface HelloRemote { public String sayHello(String name); }
Beispiel code für EJB 3.0 (Implementierung)
@Stateless //oder halt Stateful public class HelloBean implements HelloRemote { public String sayHello(String name) { return "Hello, " + name + "!"; } }
Im Gegensatz dazu ist der Zustand einer Stateful Session Bean an einen spezifischen Client gebunden. Dabei stellen die Instanzvariablen der Stateful Session Bean den Zustand der Bean dar. Die Bean verliert ihren Zustand nicht, wenn der Client einen Methodenaufruf beendet. Daher eignen sich Stateful Session Beans mehr für die Umsetzung größerer Geschäftsprozesse die mehrere Methodenaufrufe benötigen.
Entity Bean
BearbeitenEntityBeans modellieren die dauerhaften (persistenten) Daten eines Systems und werden häufig mit einem Datensatz gleichgesetzt. Ein EntityBean ist eineindeutig und existiert somit nur einmal in einem Application Server. Sie sind jedoch für mehrere Komponenten / Clients gleichzeitig verfügbar. Ein EntityBean ist vom Typ javax.ejb.EntityBean
.
Die Persistenz kann entweder vom Bean Entwickler selbst programmiert ("Bean Managed Persistence", BMP) oder vom EJB Container übernommen werden ("Container Managed Persistence", CMP).
Message Driven Bean
BearbeitenMessage-Driven Beans sind diejenigen Komponenten, die EJB-Systeme für asynchrone Kommunikation zugänglich machen. MessageDrivenBeans sind vom Typ javax.ejb.MessageDrivenBean
. Eine Message Driven Bean wird per Deployment-Descriptor grundsätzlich mit einer JMS-Queue bzw einem JMS-Topic assoziert. Innerhalb der Message-Driven-Bean ist eine Methode mit der Signatur void onMessage(javax.jms.Message)
zu implementieren. Diese Methode wird vom EJB-Container gerufen, wenn eine Nachricht auf der assoziierten Queue bzw. Topic eingeht.
Ist keine Anwendung im Applicationsserver deployed, die auf Nachrichten in einer bestimmten Queue wartet, so werden die Nachrichten vom Applicationsserver gepuffert und ausgeliefert, sobald sich eine Anwendung mit der Queue assoziiert. In den Applicationsservern der meisten Hersteller ist es sogar möglich, Queues zu persistieren (d.h. deren Inhalt in eine Datenbank bzw. Datei zu speichern) und es somit sogar zu gewährleisten, daß die auszuliefernden Nachrichten selbst nach einem Neustart des Applicationsservers noch zur Verfügung stehen.