1 Web & Datenbanken Komponentenarchitekturen, Enterprise Java Beans (EJB) Michael Klein,...

Preview:

Citation preview

1

Web & Datenbanken

Komponentenarchitekturen,

Enterprise Java Beans (EJB)Michael Klein, 23.06.2005

Vorlesung „Informationssysteme: Neuere Konzepte“

Teilweise basierend auf Folien von Daniel Pfeifer, IPD

2

Motivation für EJB

Große Geschäftsanwendung: z.B. Banksystem

DB

Server Server

Klient Klient Klient

Früher: Großes, monolithisches SystemHeute: Verteilte, webbasierte Architektur

Um welche Probleme müssen wir uns kümmern?

3

Infrastrukturelle Probleme in verteilten Systemen

Entfernte Methodenaufrufe

Lastbalancierung

Transparentes Failover(Unmerkliche Umleitung eines Klienten auf einen anderen Server im Fehlerfall)

Festschreibung von Geschäftsdaten

Transaktionsverwaltung

Dynamische Softwareupdates

Logging

Mehrfädrigkeit (Multithreading)

Resource pooling

Sicherheit

Caching

MiddlewareAllg.: Schwierig, aufwändig zu programmieren

4

Idee: Server für Middlewaredienste

Server, der diese Middlewaredienste anbietet:Applicationserver

Applikation = Code, der in der Laufzeitumgebung des Applicationservers abläuft

Divide and conquer: Trenne infrastrukturelle Aspekte aus dem Anwendungscode und überlasse sie dem Applicationserver

5

Weitere Idee: Komponenten

Idee: Zerlege Anwendung in wieder verwendbare Komponenten

Komponente:Stück Software, welches eine wohldefinierte Schnittstelle implementiert.

keine gesamte Anwendung

6

Komponente – Beispiel (1)

Preis-Komponente für Computerhardware

Input: Menge von ProduktenOutput: Endpreis

calculateTeilprobleme: Basispreis Mengenrabat

te Bundle-

Rabatte Sonderpreis Steuern Porto...

7

Komponente – Beispiel (2)

Preiskomponente auch für andere Gebiete sinnvoll

Z.B. bei Autoherstellern zur Berechnung von

Preisanfragen über das Internet Postfilialen zur Berechnung von Preisen am

Schalter Online-Buchhändlern als ein Teil eines

komplexeren Workflows

Kapselung der Logik als wieder verwendbare Komponente

Entstehung eines Komponentenmarktplatzes

8

Komponentenarchitektur

Komponentenarchitektur:Satz von Vereinbarungen zwischen Komponenteund Applikationsserver, in dem sie läuft

ApplicationServer

Komponente Vereinbarte Schnittstelle(spezifiziert

durch Komponentenarchitektur)

9

EJB als Komponentenarchitektur

Enterprise Java Beans (EJB):Komponentenarchitektur für serverseitige Javakomponenten

Enterprise Bean:Eine EJB-Komponente• „deployable“• Können in Applikationsserver geladen und ausgeführt werden

Vorteile von EJB: Von Industrie standardisiert EJB-Spezifikation ist frei erhältlich (650-seitiges PDF-File) Schnellere Applikationserstellung

10

Warum Java?

Trennung von Interface und Implementierung

Sicherheit Keine Zeiger Keine Speicherlöcher Threadverwaltung

Große Klassenbibliothek

Plattformübergreifend

11

Andere Komponentenarchitekturen

Microsoft .NET

Common Object Request Broker Architecture (CORBA)

Sun Open Net Environment (ONE)

12

Aufgaben von EJBs

Ausführung von Geschäftslogik Steuerberechnung Einkaufwagen Testen von Authentifizierung, Autorisierung Senden von Bestätigungsmails

Zugriff auf Datenbanken Eintragen einer Buchbestellung Überweisen von Geld zwischen Konten Anfragen einer Fehlerdatenbank

Zugriff auf externe Systeme SAP R/3, COBOL-Anwendung etc.

13

Wer ruft EJBs auf?

EJBs sind keine GUI-Komponenten!

Komponente

Dynamisch erzeugte Webseiten• Servlet• JSP

Rich Clients• Java Applet• Anwendungsprogramm

Als Webservice• SOAP, UDDI,

WSDL

14

Rollen beim Einsatz von EJBs

Tool Provider

EJ Bean Provider

EJB Server Provider

ApplicationAssembler

Deployer System Administrator

Tools

EJBs

Application

EJB Server

System

15

EJB und J2EE (Java 2 Enterprise Edition)

J2EE ist eine Ansammlung von Java-Technologien bzw. Standards, die das Komponentenmodell unterstützen Spezifikation, kein Produkt!

Sun liefert zum Teil Implementierungen oder definiert Standards, die von anderen Herstellern zu erfüllen sind

EJB ist ein Teil von J2EE mit einer Referenzimplementierung von Sun

http://java.sun.com/j2ee

16

Ausschnitt aus den J2EE-Technologien (1)

JSP, Java-Servlet (bekannt)

JDBC (bekannt)

Java Transaction API (JTA/JTS) für verteilte logische Transaktion

Java Naming and Directory Service (JNDI): Verzeichnisdienst für Java

Remote Method Invocation (RMI): entfernter Methodenaufruf über Prozessgrenzen hinweg, inzwischen mit CORBA-Integration (RMI-IIOP)

17

Ausschnitt aus den J2EE-Technologien (2)

EJB

JavaMail

Java Messaging Service (JMS): asynchrones, zuverlässiges Verschicken von Nachrichten in Objektform

Java Connector Architecture (JCA) zur standardisierten Integration von ERP-Systemen wie SAP

Java API for XML Parsing (JAXP)

Java Authentication and Authorization Service (JAAS)

Zu jeder dieser Technologien gibt es eine API, eine Spezifikation und mind. eine Implementierung

18

Grundsätzliche Architektur von EJB (1)

EJB: Menge von Java-Klassen (3 oder 5) mit genormter Struktur

Ausführung dieser Klassen kommen in einem EJB-Containern

EJB-Container: Repräsentation eines Applikations-Servers

Klienten können über/durch den EJB-Container auf die EJBs zugreifen und deren Methoden aufrufen

Die Methodenaufrufe erfolgen üblicherweise über RMI (Remote Method Invocation)

Der EJB-Container nimmt den Aufruf entgegen und delegiert ihn an eine entsprechende EJB

19

Grundsätzliche Architektur (2)

20

Grundsätzliche Architektur (3)

DelegationsprinzipDelegationsprinzip • der Container erhält Kontrolle über die

EJB-Aufrufe transparent zusätzliche Funktionalität

bereitstellbar:• Sicherheit• Rechteverwaltung• Transaktionalität• Persistenz• Lebenszyklusverwaltung von EJBs• Nebenläufigkeit von Beans

21

2 Arten von EJBs

Session Beans: Realisieren Workflows und Dienste Können für statische Funktionalität benutzt

werden Mit Zustand (stateful) oder zustandslos (stateless) Nicht persistierbar Bsp: Kreditkartenautorisierer, DNA-Sequenzer

Entity Beans Repräsentieren Zustand und Verhalten realer

Objekte (zum Beispiel eines Artikels) Werden persistent in einer Datenbank gespeichert Bsp: Bankkonto, Bestellung, Produkt, DNA-Strang

22

Aufgabe: Finden von Session und Entity Beans

Bei der Warenkorbfunktionalität eines Webshobs soll der Kunde die Möglichkeit haben, seine aktuellen ausgewählten Artikel sowie alte Aufträge einsehen zu können. Die Anzeige kann in einer gewünschten Währung erfolgen und berechnet automatisch die anfallenden Portokosten. Nach einem Klick auf „Abschicken“ erhält der Kunde ein persönliches Bestätigungsschreiben und seine Bestellung wird in das System aufgenommen. Er wird anschließend auf eine Seite geleitet, auf der er weitere passende Angebote erhält.

23

Klienteninteraktion mit Beans

ApplicationServer

EJB SessionBean

EJB SessionBean

EJB EntityBean

C++ ClientJava-

ApplikationJava-Applet

Servlet JSP

Webserver

BrowserAnwendung von Geschäftspartne

rnHTML SOAP

CORBA/IIOP RMIRMI

24

Eine EJB im Detail (1)

3 (Java-) Klassen bzw. Interfaces Die Bean-Klasse: Funktionalität der Bean

(wichtigste Klasse) Das Home-Interface: Schnittstelle zum

Erzeugen, Finden und Löschen von EJBs durch Klienten

Das Remote-Interface stellt die „öffentlichen“ Methoden aus der Bean-Klasse den Klienten (für den Aufruf über RMI) zur Verfügung

Analog zu Home- und Remote-Interface können noch zwei weitere Klassen (Local-Home- und Local-Remote-Interface) für nicht-RMI-Zugriffe auf Beans hinzukommen...

25

Eine EJB im Detail (2)

26

EJB-Object

EJB-Container = Indirektionsstufe zwischen Klient und Bean

Aufruf der Bean nie direkt, sondern immer über EJB-Object

EJB-Object weiß bescheid über Netzwerk Transaktionsschutz Sicherheit

EJB-Object = Teil des Kontainers, wird automatisch vom Server-Provider aus der Enterprise Bean erzeugt.

27

Delegation über EJB-Object

28

Klientenzugriff auf eine EJB (1)

Die Klient besorgt sich Zugriff auf einen als bekannt vorausgesetzten JNDI-Server

Über JNDI (dem Java Verzeichnis-Dienst) sucht (und findet) er das Home-Interface der entsprechenden EJB

Möglich, weil das entsprechende EJB-Home-Interface mit einem Namen (einem Java-String) im JNDI-Verzeichnis registriert sein muss.

Über das Home-Interface kann man dann EJBs mit speziellen find- und create-Methoden finden bzw. erzeugen.

Man erhält dann eine RMI-Referenz auf eine Bean. Die Referenz implementiert das Bean-Remote-Interface

29

Klientenzugriff auf eine EJB (2)

30

Beispiel EJB: Hello World

Komplett lauffähiger Code für EJB und aufrufenden Klient

Implementiert als stateless Session-Bean (zustandslos, nicht persistent)

Liefert den String „Hello, World!“ an den Klienten, dieser gibt in auf der Konsole aus

31

Hello World: Hello.java

package hello;

/** * This is the HelloBean remote interface. */public interface Hello extends javax.ejb.EJBObject{

/** * The one method - hello - returns a greeting to the client. */ public String hello() throws java.rmi.RemoteException;}

Remote Interface

32

Hello World: HelloBean.java

package hello;import javax.ejb.SessionContext;

// Implemented as stateless session bean.public class HelloBean implements javax.ejb.SessionBean{ // EJB-required methods public void ejbCreate() {} public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext ctx) {} // Business methods public String hello() {

return "Hello, World!"; }}

Bean

33

Hello World: HelloHome.java

package hello;

/** * One create() method is in this Home Interface, which * corresponds to the ejbCreate() method in HelloBean. */public interface HelloHome extends javax.ejb.EJBHome{

/* * This method creates the EJB Object. * * @return The newly created EJB Object. */ Hello create() throws java.rmi.RemoteException, javax.ejb.CreateException;}

Home Interface

34

Hello World: HelloClient.javapackage hello;import javax.naming.Context;import javax.naming.InitialContext;import java.util.Properties;

public class HelloClient {public static void main(String[] args) throws Exception {

Properties props = System.getProperties();

// Obtain the JNDI initial context.Context ctx = new InitialContext(props);

// Get a reference to the hello home objectObject obj = ctx.lookup("ejb/local/examples/HelloWorld");HelloHome home = (HelloHome) javax.rmi.PortableRemoteObject.narrow(obj, HelloHome.class);

// Creat an instance of the hello ejb through hello homeHello hello = home.create();

// Call the hello() method on the EJB object.System.out.println(hello.hello());

// Remove the ejb instance.home.remove();

} }

35

Besonderheiten

Hello, HelloBean und HelloHome erweitern jeweils Standard-EJB-Schnittstellen (nämlich EJBObject, SessionBean bzw. EJBHome

Notwendig damit der EJB-Container die EJB gemäß der Spezifikation verwalten kann!

Die Methoden ejbCreate(), ejbRemove(), ejbActivate(), ejbPassivate() werden vom EJB-Container als „Callbacks“ beim Lebenszyklusmanagement aufgerufen

Die EJB hat dann die Möglichkeit noch Aktivitäten auszuführen, bevor der Container in den Lebenszyklus eingreift.

36

Lebenszyklus einer Bean

Um Ressourcen (wie etwa Hauptspeicher) zu schonen kann und darf der Container Beans auslagern (zum Beispiel serialisiert auf die Festplatte schreiben) und später – wenn notwendig – wieder einlagern

Bean-Instanzen können auch in Pools vorgehalten werden um dann effizient aktiviert zu werden (instance pooling)

Die Methoden der vorigen Folien unterstützen diese Vorgänge von Seiten der Bean

37

Lebenszyklusdiagramm für Stateful Session-Beans

38

Installation von Beans

Beans sollen installiert (deployed) werden können, während der EJB-Server arbeitet (hot deployment)

Das ist wichtig, wenn der EJB-Server unternehmenskritische Anwendungen birgt (Beispiel Bank-Server, Einkaufsportal...)

Deployment ist eigenständiger Prozess

Funktionsweise hängt vom EJB-Server-Produkt ab (bei JBoss: entspr. Dateien in ein besonderes Verzeichnis kopieren...)

39

Format für Bean-Deployment

Ist durch den EJB-Standard spezifiziert

Die kompilierten Klassen einer EJB werden in ein Java-Archiv gepackt (.jar Datei)

Zusätzlich: Meta-Informationen über die EJB in einer XML-Datei – dem Deployment Descriptor

.jar und xml Datei werden (mit einigen weiteren Dateien) zu einem Enterprise Archiv (.ear Datei ähnlich zu .jar Datei) geschnürt.

Diese Datei wird dann „deployed“.

40

Deployment Deskriptor

Enthält viele wichtige Infos für den EJB-Container, damit dieser weiß, wie er eine EJB behandeln soll

Geht nicht notwendig aus den Klassen der EJB hervor

U.a. beschreibt der Deskriptor wie eine Bean zu behandeln ist bzgl.

Transaktionalität Zugriffrechten und Schutz Persistenz Failover (Verhalten beim Absturz der EJB-Servers) Nebenläufigkeit

Struktur eines Deskriptors ist Teil des EJB-Standards

41

Der HelloWorld-Deskriptor

<ejb-jar> <enterprise-beans> <session> <ejb-name>Hello</ejb-name> <home>hello.HelloHome</home> <remote>hello.Hello</remote> <local-home>hello.HelloLocalHome</local-home> <local>hello.HelloLocal</local> <ejb-class>hello.HelloBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans></ejb-jar>

42

EJB und Datenbanken

43

Entity Beans (1)

Repräsentieren persistente Zustände

Der Standard für Entity-Beans ist auf ein (simples) Objekt-Relationales-Mapping ausgelegt, d.h. Speicherung in relationaler DB

Andere Persistenztechniken möglich

44

Entity Beans (2)

Persistenz kann vom EJB-Container (transparent) erledigt werden CMP – container managed persistence

... oder von Hand in der Entity Bean programmiert werden BMP – bean managed persistence

Im 2. Fall kann man zum Beispiel JDBC verwenden

45

Zur Verdeutlichung...

46

CMP versus BMP

Wie gesehen: bei BMP muss man O/R Mapping für jede Klasse „von Hand“ programmieren

Man muss aber nicht JDBC verwenden

Bei CMP über nimmt der Container die Implementierung/Umsetzung der ejbLoad(), ejbStore(), ejbCreate(), ejbRemove() – Methoden

Detaillierte Mapping-Infos kommen in den Deployment-Deskriptor und in container-spezifische XML-Dateien

47

Was sind also EJBs?

Was sind Enterprise Java Beans (EJB)?

Serverseitige Komponentenarchitektur zur einfachen

Erstellung von komponentenbasiertenAnwendungen, die verteilt skalierbar zuverlässig sichersind, ohne die komplexen

Infrastrukturaufgabenselbst programmieren zu müssen.

Bereitstellung der Infrastruktur durch industrielle Applicationserver.

48

Zusammenfassung

Komponente

Middleware

Applicationserver

Komponentenarchitektur

EJB-Kontainer

Delegation

Session-Bean vs. Entity Bean

CMP vs. BMP

Home vs. Remote Interface

EJB-Object

J2EE

49

Literatur

Buch

Ed Roman, Scott Ambler, Typer JewellMastering Enterprise Java Beans (2nd Edition)WileyISBN 0-471-41711-4

Auch kostenlos im Internet herunterladbar(Anmeldung erforderlich):

http://www.theserverside.com/books/wiley/masteringEJB/

50

ANHANG(für Interessierte)

51

Entity Bean – Beispiel Code

Repräsentiert Personen-Objekte mit Namen und Id (Schlüssel)

BMP

Daten über JDBC in rel. Datenbank gespeichert

Neben Standard Bean-Klassen gibt es noch die PersonPK (=Primary Key) die den DB-Schlüssel Id repräsentiert

DB besteht aus (einziger Tabelle) Person(id, ownerName)

52

Person.java

package examples;

import javax.ejb.*;import java.rmi.RemoteException;

public interface Person extends EJBObject {

public String getName() throws RemoteException;public void setName(String name) throws RemoteException;public String getID() throws RemoteException;public void setID(String id) throws RemoteException;

}

Remote Interface

53

PersonHome.java

package examples;

import javax.ejb.*;import java.util.Collection;import java.rmi.RemoteException;

public interface PersonHome extends EJBHome { public Person create(String id, String ownerName) throws CreateException, RemoteException;

public Person findByPrimaryKey(PersonPK key) throws FinderException, RemoteException;}

Home Interface

54

PersonPK.java

package examples;

import java.io.Serializable;

public class PersonPK implements java.io.Serializable { public String personID;

public PersonPK(String id) { this.personID = id; }

public PersonPK() {}

public int hashCode() { return personID.hashCode(); } public boolean equals(Object person) { return ((PersonPK)person).personID.equals(personID); } }

Bean

PK = Primary Key

55

PersonBean.java (1)

package examples;

import java.sql.*;import javax.naming.*;import javax.ejb.*;import java.util.*;

public class PersonBean implements EntityBean {protected EntityContext ctx;

private String id; // PKprivate String ownerName;public AccountBean() {}

public void setOwnerName(String name) { ownerName = name; }public String getOwnerName() { return ownerName; }public String getID() { return id };public void setID(String id) { this.id = id; }

Bean

56

PersonBean.java (2)

public void ejbRemove() throws RemoveException { PersonPK pk = (PersonPK) ctx.getPrimaryKey(); String id = pk.id;

PreparedStatement pstmt = null; Connection conn = null; try { conn = getConnection(); pstmt = conn.prepareStatement("delete from persons where id = ?"); pstmt.setString(1, id); if (pstmt.executeUpdate() == 0) { throw new RemoveException("Person " + pk + " failed remove."); } } catch (Exception ex) { throw new EJBException(ex.toString()); } finally { /* ... close JDBC resources... */ } }

57

PersonBean.java (3)

public void ejbLoad() { PersonPK pk = (PersonPK) ctx.getPrimaryKey(); String id = pk.id; PreparedStatement pstmt = null; Connection conn = null; try { conn = getConnection(); pstmt = conn.prepareStatement( "select ownerName from persons where id = ?"); pstmt.setString(1, id); ResultSet rs = pstmt.executeQuery(); rs.next(); ownerName = rs.getString("ownerName"); } catch (Exception ex) { throw new EJBException("Person " + pk + " failed to load.", ex); } finally { // ... close JDBC resources... } }

58

PersonBean.java (4)

public PersonPK ejbFindByPrimaryKey(PersonPK key) throws FinderException { PreparedStatement pstmt = null; Connection conn = null; try { conn = getConnection(); pstmt = conn.prepareStatement("select id from persons where id = ?"); pstmt.setString(1, key.toString()); ResultSet rs = pstmt.executeQuery(); rs.next(); return key; } catch (Exception e) { throw new FinderException(e.toString()); } finally {

// ... close JDBC resources... }}

59

PersonBean.java (5)

public void ejbActivate() {}public void ejbPassivate() {}public void setEntityContext(EntityContext ctx) { this.ctx = ctx; }public void unsetEntityContext() { this.ctx = null; }public void ejbPostCreate(String accountID, String ownerName) {}

public void ejbStore() { // ... Ähnlich wie ejbLoad ...}

public PersonPK ejbCreate(String id, String ownerName) throws CreateException { // ... Ähnlich wie ejbFindByPrimaryKey ...}

60

PersonBean.java (6)

public Connection getConnection() throws Exception { try { Context ctx = new InitialContext(); javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("java:comp/env/jdbc/ejbPool"); return ds.getConnection(); } catch (Exception e) { throw e; }}

61

Ok – eine Menge Code...

Das meiste sind JDBC Zugriffe die Tabellenzeilen auf EJB-Felder abbilden

Noch mehr Callbacks als bei Session Beans: PersonBean erweitert javax.ejb.EntityBean und

muß nun ejbLoad() zum Laden der Bean aus der DB und ejbStore() zum Speichern den Bean in DB

implementieren sowie einige weiter Methoden...

ejbFind...() Methoden dienen zum Finden von Enitity Beans über Suchkritierien

Es werden dann (meist) Kollektionen von Schlüsseln (wie etwa PersonPK) zurückgegeben.

Recommended