Gliederung Kapitel 3 Java-Komponenten

Werbung
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
Herunterladen