Gliederung 1. Software-Komponenten: Grundlegende Begriffe 2. Systematischer Entwicklungsprozess für Komponenten-Software mit UML 3. Java-Komponenten-Technologien 3.1 JavaBeans-Technologie 3.2 Web-Komponenten mit Java 3.3 Enterprise JavaBeans-Technologie 4. Komponentenspezifikation 5. Komponententechnologien im Vergleich 5.1 Microsoft COM/DCOM/COM+ 5.2 CORBA Component Model 5.3 Vergleich der Komponentenstandards 6. Zusammenfassung und Ausblick Technische Universität Dresden Prof. Hußmann Softwarekomponenten Kapitel 3 Java-Komponenten-Technologien 3.3 Enterprise JavaBeans-Technologie – EJB-Architektur – Session Beans – Entity Beans – Transaktionsbehandlung, Sicherheit – Message-Driven Beans Literatur: – Vlada Matena/Beth Stearns: Applying Enterprise JavaBeans, Addison Wesley 2001 – Richad Monson-Haefel: Enterprise JavaBeans, O'Reilly 2000 – Sun Microsystems: Enetrprise JavaBeans Specification, Version 2.0, Proposed Final Draft 2, April 2001 Technische Universität Dresden Prof. Hußmann Seite 1 Softwarekomponenten Was sind Enterprise JavaBeans (EJBs)? • EJBs sind Server-Komponenten für verteilte Mehrbenutzeranwendungen mit persistenter Datenhaltung. • Typische Anforderungen: – Performance und Skalierbarkeit » z.B. mehrere parallele Instanzen desselben Programms » z.B. Wiederverwendung bestehender Threads ("Pooling") – Verwaltung von Datenbankzugriffen » Transaktionen » Management von Datenbank-Verbindungen » persistente verteilte Referenzen – Sicherheitsanforderungen » Zugriffsrechte • Klassische Lösung: Transaktionsmonitore (z.B. IBM CICS) • EJBs: "Transaktionsmonitor für objektorientierte Komponenten" • Ziel: – Trennung der Geschäftslogik von Code zur Erfüllung obiger Anforderungen Technische Universität Dresden Prof. Hußmann Softwarekomponenten Container: Infrastruktur für Server-Komponenten • "Container": – – – – – Laufzeitumgebung für Komponenten bietet Dienste für Komponenten über Standard-APIs nutzt Dienste der Hardware- und Softwareumgebung bietet Werkzeuge zur Konfiguration und Installation von Komponenten generiert Code zur Laufzeitunterstützung von Komponenten Server Client Application GUI Container Stub EJB Web Client Browser Web Service JSP/ Servlets Technische Universität Dresden Stub Prof. Hußmann Seite 2 Softwarekomponenten Container: Dienste Server Container Client bietet Portabilität, Administration, Sicherheit EJB bietet Persistenz von Daten, Aktivierung/Passivierung, Ressourcenmanagement, Transaktionsunterstützung, Sicherheitsfunktionen nutzt Datenbanksysteme, Prozeßverwaltung, Verteilte Middleware (CORBA, RMI), Verzeichnisdienste (z.B. JNDI), ... Technische Universität Dresden Prof. Hußmann Voraussetzung: Einhaltung von Konventionen Softwarekomponenten Grundbestandteile einer EJB • Fachliche Klasse ("EJB Class"): – z.B. CounterEJB.java – Implementiert fachliche Daten und Methoden – Abstrahiert von Leistungen des Containers • Zugriffs-Schnittstelle ("Remote Interface"): – z.B. Counter.java – Schnittstelle für fachliche Daten und Methoden – Wird in den Client-seitigen Stubs verwendet • Verwaltungs-Schnittstelle ("Home Interface"): – z.B. CounterHome.java – Schnittstelle zum Erzeugen und Finden von Komponenten – Wird in den Client-seitigen Stubs verwendet • "Deployment Descriptor" (XML-Datei) – Dokumentiert Zusammenhang der Teile einer EJB und weitere Information – Meist automatisch von "Deployment Tools" erzeugt und genutzt Technische Universität Dresden Prof. Hußmann Seite 3 Softwarekomponenten Nutzung der EJB-Bestandteile Server Home Interface Container Container Home Interface EJB Naming Interface Client EJB Class Remote Interface Deployment Descriptor Remote Interface Zwischengeschaltete (Adapter-)Objekte (automatisch generiert) Technische Universität Dresden Prof. Hußmann Softwarekomponenten Kapitel 3 Java-Komponenten-Technologien 3.3 Enterprise JavaBeans-Technologie – EJB-Architektur – Session Beans – Entity Beans – Transaktionsbehandlung, Sicherheit – Message Beans Technische Universität Dresden Prof. Hußmann Seite 4 Softwarekomponenten Typen von Enterprise Java Beans • Session Beans – Stateless Session Beans – Stateful Session Beans • Entity Beans – Container-Managed Persistence – Bean-Managed Persistence • Message-Driven Beans Technische Universität Dresden Prof. Hußmann Softwarekomponenten Session Beans • Eine Session Bean ist eine Abstraktion eines Anwendungsfalles für einen individuellen Anwender. – Existiert oft über längere Zeit, aber nur bis zur Erfüllung der Aufgabe – Speichert meist Daten » Benutzereingaben » Abfrageergebnisse aus persistenten Speichern – Typen von Session Beans: » Normalfall: "Stateful session bean" » Spezialfall: "Stateless session bean" (keine Datenspeicherung) – Nicht zu verwechseln mit "Sessions" in Web-Anwendungen » Referenz oder Handle auf Session Bean wird in Benutzeranwendung (oder Web-Session) gehalten, solange benötigt » "Handle": Extern speicherbare Repräsentation einer Referenz Technische Universität Dresden Prof. Hußmann Seite 5 Softwarekomponenten Einschub: Java Remote Method Invocation (RMI) • Java RMI: – CORBA-ähnliche Infrastruktur für verteilte Java-Objekte – Bis Java 1.2: Alternative RMI oder CORBA-IIOP für Java • Java RMI-IIOP: (IIOP = Internet Inter-ORB-Protokoll) – Ab Java 1.3 (Standard Edition): Weiterentwicklung von Java RMI – Kompatibel mit CORBA – Verwendet Java Naming and Directory Service (JNDI) • Für EJB-Anwender und -Entwickler notwendige Informationen: – Alle "Remote"-Schnittstellen erweitern java.rmi.Remote. – Jeder "Remote" Methodenaufruf kann die Exception java.rmi.RemoteException auslösen. – Parameter von "Remote"-Methodenaufrufen: Primitive oder serialisierbare Typen (Übertragung als Zeichenreihe) – Basisklasse für "Servant"-Objekte: javax.rmi.PortableRemoteObject » stellt statische Methode narrow zur Typanpassung ("cast") zur Verfügung Technische Universität Dresden Prof. Hußmann Softwarekomponenten Beispiel: Remote Interface "Counter" import java.rmi.RemoteException; import javax.ejb.EJBObject; public interface Counter extends EJBObject { public int getCurrent() throws RemoteException; public int getStartValue() throws RemoteException; public void setStartValue(int value) throws RemoteException; public int getIncrValue() throws RemoteException; public void setIncrValue(int value) throws RemoteException; public boolean getEnabled() throws RemoteException; public void setEnabled(boolean value) throws RemoteException; public void reset() throws RemoteException; public void count() throws RemoteException; } • JavaBeans-Konventionen (z.B. "getX"/"setX") müssen nicht eingehalten werden. • Alle Methoden müssen RemoteException deklarieren. • Alle Parameter müssen den RMI-IIOP-Konventionen genügen (d.h. einfache Typen oder serialisierbar). • "extends EJBObject" ist vorgeschrieben. Technische Universität Dresden Prof. Hußmann Seite 6 Softwarekomponenten Interface javax.ejb.EJBObject import java.rmi.RemoteException; public interface EJBObject extends java.rmi.Remote { public EJBHome getEJBHome() throws RemoteException; public Object getPrimaryKey() throws RemoteException; public void remove() throws RemoteException, RemoveException; public Handle getHandle() throws RemoteException; public boolean isIdentical(EJBObject obj2) throws RemoteException; } • Nützliche Methoden zur Client-Programmierung • getPrimaryKey nur für Entity Beans • Container-Werkzeuge generieren eine Implementierungsklasse für das Counter-Interface. • Realisierung der Methoden aus EJBObject wird dabei automatisch zur Verfügung gestellt. Technische Universität Dresden Prof. Hußmann Softwarekomponenten Beispiel: Home Interface "CounterHome" import javax.ejb.EJBHome; import java.rmi.RemoteException; import javax.ejb.CreateException; public interface CounterHome extends EJBHome { Counter create() throws RemoteException, CreateException; } • Prinzip des Entwurfsmusters "Factory Method" • Für Session Beans: mindestens eine create-Methode • Ergebnistyp: Zugehöriges Remote Interface • Bei Entity Beans kann ein Home-Interface auch leer sein. • Für Session Beans: Alle Methoden müssen "create" genannt werden. • Evtl. mehrere überladene create-Methoden • Stateless Session Beans: Nur eine create-Methode ohne Parameter • Alle create- Methoden müssen RemoteException und CreateException deklarieren. • Alle Parameter müssen den RMI-IIOP-Konventionen genügen (d.h. einfache Typen oder serialisierbar). Technische Universität Dresden Prof. Hußmann Seite 7 Softwarekomponenten Interface javax.ejb.EJBHome import java.rmi.RemoteException; public interface EJBHome extends java.rmi.Remote { void remove(Handle handle) throws RemoteException, RemoveException; void remove(Object primaryKey) throws RemoteException, RemoveException; EJBMetaData getEJBMetaData() thros RemoteException; HomeHandle getHomeHandle() throws RemoteException; } • Nützliche Methoden zur Client-Programmierung • remove über PrimaryKey nur für Entity Beans • Container-Werkzeuge generieren eine Implementierungsklasse für das CounterHome-Interface. • Realisierung der Methoden aus EJBHome wird dabei automatisch zur Verfügung gestellt. Technische Universität Dresden Prof. Hußmann Softwarekomponenten Beispiel: EJB Class "CounterEJB" (1) import javax.ejb.SessionBean; import javax.ejb.SessionContext; public class CounterEJB implements SessionBean { private private private private int count; int startValue; int incrValue; boolean enabled; public void ejbCreate() { startValue = 0; incrValue = 1; reset(); enabled = true; } public int getCurrent () { return count; } public int getStartValue () { return startValue; } Für jede create(x, y)-Methode im Home Interface hier eine ejbCreate(x, y)-Methode ! (Ergebnistyp void) ... Technische Universität Dresden Prof. Hußmann Seite 8 Softwarekomponenten Beispiel: EJB Class "CounterEJB" (2) ... public void reset () { count = startValue; } public void count () { if (enabled) { count += incrValue; } } // EJB Lifecycle Callback Methods public public public public void void void void ejbRemove() {} ejbActivate() {} ejbPassivate() {} setSessionContext(SessionContext sc) {} } Technische Universität Dresden Prof. Hußmann Softwarekomponenten Interface javax.ejb.SessionBean public interface SessionBean extends EnterpriseBean { void setSessionContext(SessionContext sessionContext) throws EJBException, RemoteException; void ejbRemove() throws EJBException, RemoteException; void ejbActivate() throws EJBException, RemoteException; void ejbPassivate() throws EJBException, RemoteException; } • "Callback"-Methoden • werden vom Container an passenden Stellen automatisch aufgerufen • Prinzip: Entwurfsmuster "Template Method" • Müssen in der fachlichen EJB-Klasse realisiert werden • Minimal-Realisierung: Leerer Rumpf • Nichttrivale Realisierungen: • z.B. über SessionContext: Zugriff auf Informationen zum Aufrufer • z.B. in ejbRemove: "Aufräumarbeiten" mit belegten Ressourcen Technische Universität Dresden Prof. Hußmann Seite 9 Softwarekomponenten Konfiguration und Installation ("Deployment") XYZ Remote Interface (.class) XYZ Home Interface (.class) XYZ EJB Class (.class) Hilfsklassen Hilfsklassen Deployment Descriptor Verpacken Standardisiertes Austauschformat EJB-JAR-Datei JNDI-Namen EJB-JAR EJB-JAR Verpacken EAR-Datei einbinden in EAR = EJB Archive Technische Universität Dresden Zusatzinformation Prof. Hußmann EJB-ServerProzeß Softwarekomponenten Beispiel: Deployment-Werkzeug Sun J2EE ReferenzImplementierung 1.3 beta Technische Universität Dresden Prof. Hußmann Seite 10 Softwarekomponenten Beispiel: Deployment Descriptor <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE ejb-jar PUBLIC ’-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN’ ’http://java.sun.com/dtd/ejbjar_2_0.dtd’> <ejb-jar> <display-name>CounterJAR</display-name> <enterprise-beans> <session> <display-name>CounterBean</display-name> <ejb-name>CounterBean</ejb-name> <home>CounterHome</home> <remote>Counter</remote> <ejb-class>CounterEJB</ejb-class> <session-type>Stateful</session-type> <transaction-type>Bean</transaction-type> <security-identity> <description></description> <use-caller-identity></use-caller-identity> </security-identity> </session> </enterprise-beans> </ejb-jar> Technische Universität Dresden Prof. Hußmann Softwarekomponenten Client-Programm für "Counter" Session Bean import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import Counter; import CounterHome; ... try { Context ictx = new InitialContext(); Object ctrRef = ictx.lookup("JNDI Name"); CounterHome ctrHome = (CounterHome)PortableRemoteObject.narrow (ctrRef,CounterHome.class); Counter counter = ctrHome.create(); ... counter.setStartValue(...); counter.count(); ... } catch (Exception ex) { System.err.println("Error when connecting to server"); ex.printStackTrace(); } Technische Universität Dresden Prof. Hußmann Seite 11 Softwarekomponenten Zwei komplizierte Zeilen... CounterHome ctrHome = (CounterHome)PortableRemoteObject.narrow (ctrRef,CounterHome.class); Counter counter = ctrHome.create(); entspricht von der Idee her dem (falschen) Code: Counter counter = ((CounterHome)ctrRef).create(); Ursache: CORBA-kompatibles RMI-IIOP Pragmatische Lösung: Immer das gleiche Code-Muster verwenden... Technische Universität Dresden Prof. Hußmann Softwarekomponenten JNDI-Namen • Einfachster Fall: Client hat Zugang zum gleichen JNDI Server wie der EJB-Container – Ansonsten Pfadnamen-Syntax verwenden • Client-Programm: try { Context ictx = new InitialContext(); Object ctrRef = ictx.lookup("MyCounter"); • EJB Application: Technische Universität Dresden Prof. Hußmann Seite 12 Softwarekomponenten Ablauf bei Client-Aufruf ctrHome: CounterHome Client Verteiltes Objekt (Stub+Servant) ictx: Context lookup ctrHome create counter: Counter sc: Session Context : CounterEJB setSessionContext(sc) ejbCreate counter setStartValue setStartValue count count Technische Universität Dresden Prof. Hußmann Softwarekomponenten Stateful vs. Stateless Session Bean • Stateful Session Bean: – individuell dem Client für eine gewisse Zeit zugeordnet, z.B. Dialog • Stateless Session Bean: – unabhängig vom Client, z.B. einfache Abfrage – effizienter durch Wiederverwendung von Threads (Pooling) Stateful Stateless Container Container Client1 EJB1 Client1 EJB1 Client2 EJB2 Client2 EJB2 Technische Universität Dresden Prof. Hußmann Seite 13 Softwarekomponenten Kapitel 3 Java-Komponenten-Technologien 3.3 Enterprise JavaBeans-Technologie – EJB-Architektur – Session Beans – Entity Beans – Transaktionsbehandlung, Sicherheit – Message Beans Technische Universität Dresden Prof. Hußmann Softwarekomponenten Entity Beans • Entity Bean: – Abstraktion eines persistenten Speichers – Speichereinheiten mit eindeutigem Primärschlüssel. – Speichermedien: » relationale Datenbanksysteme » externe Systeme » HTTP-Server mit XML-Schnitttstelle » ... • Entity Beans sind völlig unabhängig vom Client. – Stateful Session Beans dagegen Client-bezogen • Entity Beans dienen als Hilfsmittel für Session Beans. • Prinzipiell sind auch Session Beans ohne Entity Beans möglich. – z.B. Persistente Daten in der Session Bean über JDBC verwaltet Technische Universität Dresden Prof. Hußmann Seite 14 Softwarekomponenten Beispiel: Remote Interface "Account" import java.rmi.RemoteException; import javax.ejb.EJBObject; public interface Account extends EJBObject { public int getBalance() throws RemoteException; public String getOwner() throws RemoteException; void credit(int amount) throws RemoteException; void debit(int amount) throws RemoteException, InsufficientFundsException; } • Konventionen identisch zu Session Beans Technische Universität Dresden Prof. Hußmann Softwarekomponenten Beispiel: Home Interface "AccountHome" import import import import javax.ejb.EJBHome; java.rmi.RemoteException; javax.ejb.CreateException; javax.ejb.FinderException; public interface AccountHome extends EJBHome { Account create(String owner) throws RemoteException, CreateException; Account findByPrimaryKey(Integer pk) throws RemoteException, FinderException; Collection findByOwner(String owner) throws RemoteException, FinderException; } • Jede Entity Bean hat einen Primärschlüssel. • beliebige RMI-IIOP-Wertklasse; deklariert im Deployment Descriptor • Zusätzlich zu den create-Methoden: find-Methoden • Verpflichtend: findByPrimaryKey mit Primärschlüssel als Argument • Optional: Beliebige weitere find-Methoden • mengenwertige Ergebnisse als java.util.Collection Technische Universität Dresden Prof. Hußmann Seite 15 Softwarekomponenten Persistenz-Verwaltung • Bean-Managed Persistence (BMP): – Entity Bean ist selbst verantwortlich für Speicherung – z.B. über JDBC – z.B. externe Systeme • Container-Managed Persistence (CMP): – Entity Bean deklariert bestimmte Felder als persistent – Container übernimmt Speicherung, z.B. in RDBMS » (Sun Referenzimplementierung: RDBMS "Cloudscape") – Einfacher, portabler • Achtung: Änderung in CMP-Schnittstelle bei EJB 2.0 – nun: Deklaration persistenter Felder über abstrakte Zugriffsmethoden – früher: öffentliche Instanzvariablen der Bean-Klasse Technische Universität Dresden Prof. Hußmann Softwarekomponenten Beispiel: EJB Class "AccountEJB" (Auszug) import javax.ejb.EntityBean; import javax.ejb.EntityContext; public abstract class AccountEJB implements EntityBean { // Container-managed persistent fields Je eine ejbCreatepublic abstract int getAccountNo(); und ejbPostCreatepublic abstract void setAccountNo(int no); Methode. public abstract String getOwner(); (ejbPostCreate zum public abstract void setOwner(String owner); Zugriff auf erzeugtes public abstract int getBalance(); EJBObject) public abstract void setBalance(int bal); ejbCreate liefert public Integer ejbCreate(String owner) { ... }Primärschlüssel-Wert. public void ejbPostCreate (String owner) { ... } public Account ejbFindByPrimaryKey(Integer pk) { ... } public Collection ejBFindByOwner(String owner) { ... } public int getBalance() { ... } public String getOwner() { ... } void credit(int amount) { ... } void debit(int amount) { ... } ... } Technische Universität Dresden Prof. Hußmann Seite 16 Softwarekomponenten Interface javax.ejb.EntityBean public interface EntityBean extends EnterpriseBean { void setEntityContext(EntityContext entityContext) throws EJBException, RemoteException; void unSetEntityContext() throws EJBException, RemoteException; void ejbRemove() throws EJBException, RemoteException , RemoveException; void ejbActivate() throws EJBException, RemoteException; void ejbPassivate() throws EJBException, RemoteException; void ejbLoad() throws EJBException, RemoteException; void ejbStore() throws EJBException, RemoteException; } • "Callback"-Methoden • werden vom Container an passenden Stellen automatisch aufgerufen • Müssen in der fachlichen EJB-Klasse realisiert werden Technische Universität Dresden Prof. Hußmann Seite 17 Softwarekomponenten