Enterprise Application Integration Björn Eilers Enterprise Application Integration EAI mit der Java 2 Enterprise Edition und Enterprise JavaBeans
Enterprise Application Integration
Björn Eilers
Enterprise Application IntegrationEAI mit der Java 2 Enterprise Editionund Enterprise JavaBeans
2
Enterprise Application Integration
Björn Eilers
Nachrichtenmanagement
Einordnung in funktionale Bestandteile einer EAI Infrastruktur
Prozessmanagement
MiddlewareAd
apte
r
Met
adat
enba
nk fü
r Zus
atzd
iens
te
Adap
ter
Adap
ter
Adap
ter
Adap
ter
Adap
ter
Physisches Netzwerk
Java 2 Enterprise Edition
3
Enterprise Application Integration
Björn Eilers
Java 2 Enterprise Edition
Keine Programmiersprache, sondern Spezifikationen und Verfahren zur Entwicklung, Einführung und Verwaltung komplexer und verteilter Anwendungssysteme
Standards für Komponenten, Container und Dienste sowie Definition einer Systemarchitektur
Abstraktion… …von Präsentation und Implementierung
Gleiche Schnittstellen für verschiedene Clients (Browser, Fat Client, Mobiltelefone, …)
…von Geschäftslogik und PlattformFlexible Implementierung von Geschäftsprozessen über wiederverwendbare Komponenten (Enterprise JavaBeans)
4
Enterprise Application Integration
Björn Eilers
Java 2 Enterprise Edition
5
Enterprise Application Integration
Björn Eilers
Java 2 Enterprise Edition
Spezifikationsvorgaben in J2EE-Anwendungsservern implementiertLaufzeitumgebung für J2EE Komponenten, die die J2EE Spezifikation erfülltLogische Aufteilung in Container (Web-Container, EJB-Container)Muss, um Spezifikation zu erfüllen, diverse Dienste anbieten
Dienste eines J2EE-Anwendungsservers:WebserverSicherheitsdienste (Authentifizierung, Autorisation, Zugangsbeschränkungen, Verschlüsselung – über JAAS)Transaktionsmanagement (über JTS, JTA)Namensdienste (über JNDI)Persistenzmanagement (über JDBC)Ressourcenverwaltung (Pooling, Aktivierung und Passivierung von EJBs)Interoperabilität: Anbindung von J2EE-fremden Systemen (über CORBA, J2EE Connector Architektur und Web Services)
6
Enterprise Application Integration
Björn Eilers
J2EE-Komponenten
ServletsJava-Klassen, die HTTP-Anfragen verarbeiten und HTTP-Antworten erstelleni.d.R. Controller-Komponenten für Webanwendungen, manchmal auch ViewAlternativ als Gateway für HTTP-basierenden Protokolle verwendet
Java Server Pages / Java Server FacesMarkup-Dateien, die neben HTML-/XML-Tags auch Java-Code und spezielle JSP-/JSF-Tags enthaltenwerden als Servlet kompiliertView-Komponenten für Webanwendungen
7
Enterprise Application Integration
Björn Eilers
J2EE-Komponenten
Enterprise JavaBeansKapseln Geschäftslogik, Daten und Nachrichtenverarbeitung für unternehmensweite AnwendungenWerden später im Detail vorgestellt
Ressourcen-Adapter („Konnektoren“)Verbindung zwischen Anwendungsserver und EIS (SAP, Bank- und Versicherungs-EIS auf Mainframes, Message Oriented Middleware…)
Applikationen bzw. AppletsBieten als Client Zugriff auf die Serverfunktionen an.
8
Enterprise Application Integration
Björn Eilers
Architektur
Üblicherweise Aufteilung in vier Schichten1. Clients (Browser, Thin Clients)2. Präsentationslogik (JSP/JSF, Servlets)3. Geschäftslogik (Enterprise JavaBeans)4. Datenhaltung (relationale und XML-Datenbanken)
Auch Drei-Schichten-Architektur möglich:1. Client mit Präsentationslogik (Fat-Client, Applet, …)2. Geschäftslogik (Enterprise JavaBeans)3. Datenhaltung
9
Enterprise Application Integration
Björn Eilers
Architektur
JSP/
JSF
Servlets
Web Container
Session Bean
Session Bean Entity Bean
Entity BeanMessage-driven Bean
Browser
Mobiltelefon
Fat Client
Message Queue
Externes System
RMI/IIOP
HTTP
Datenbank
Datenbank
Web Service
Endpunkt
Web ServiceClient
SOAP
J2EE Applikationsserver
HTTP
EJB C
ontainer
SicherheitWeb
ServicesXML-
Dienste
JDBCJTA/JTS
JMSJavaMail
JAF
Basis-dienste
Firewall
10
Enterprise Application Integration
Björn Eilers
Enterprise JavaBeans
Komponenten zur Implementierung von Geschäftsprozessen, Daten und Nachrichtenverarbeitung
Entity BeansDaten für unternehmensrelevante GeschäftsobjekteWerden in persistentem Speicher gesichert (i.d.R. Datenbank)Bean-managed Persistence: Bean kümmert sich selber um ihre PersistenzContainer-managed Persistence:
Container kümmert sich um Persistenzermöglicht automatische Verwaltung von Relationen zwischen Entitäten (Container-Managed Relationships)EJB-Query Language zum Auffinden von Entitäten in Datenbank; Bean wird über Schema angesprochen
Gemeinsam von mehreren Clients nutzbarz. B. Bankkonto, Flugreservierung, Kundendaten
11
Enterprise Application Integration
Björn Eilers
Enterprise JavaBeans
Session BeansImplementierung von Geschäftsprozessen als DienstZustandslos:
Für simple Geschäftsprozesse; kann von mehreren Clients gleichzeitig benutzt werdenKeine Daten zwischen Methodenaufrufen gespeichert, arbeiten nur auf übergebenen DatenKönnen ab EJB 2.1 Dienste auch als Web Service anbietenz. B. Geldentnahme von Bankkonto
Zustandsbehaftet:Speichern Daten über mehrere MethodenaufrufeMethodenaufrufe können Zustand der Bean verändernnur von einem Client nutzbar; Daten nicht persistentz. B. Veränderung eines Warenkorbs bei Online-Einkauf
12
Enterprise Application Integration
Björn Eilers
Enterprise JavaBeans
Message-Driven BeansStellt einen Nachrichtenempfänger dar (nicht automatisch auch einen Sender!)Serverseitige Geschäftslogik für Verarbeitung asynchroner NachrichtenBietet auf Wunsch Zustellungsgarantie (Ausfall des Systems sorgt nicht für Verlust der Nachricht)Client kommuniziert nur über Nachrichtenaustausch, Bean „lauscht“ auf das Eintreffen neuer Nachrichtenz. B. Datenabgleich zwischen zwei Filialen, Ausführung eines WorkflowsWerden in nächster Veranstaltung detailliert vorgestellt
13
Enterprise Application Integration
Björn Eilers
Enterprise JavaBeans
Weiterhin für Deployment von Enterprise JavaBeans benötigt:
Deployment DeskriptorenXML-Dokumente zur Beschreibung der Bean-Klassen und -Interfaces, der Bean-Eigenschaften sowie zur Konfiguration der Bean im ApplikationsserverEin herstellerunabhängiger Deskriptor (ejb-jar.xml), ein oder mehrere herstellerabhängige Deskriptoren (jboss.xml, sun-ejb-jar.xml, …), um server- und datenbankspezifische Eigenschaften zu definieren
JAR-Archive mit Deployment Descriptoren, kompilierten Klassen und Interfaces sowie benötigten Bibliotheken
14
Enterprise Application Integration
Björn Eilers
Zugriff auf Entity und Session Beans
Zugriff auf Entity und Session Beans über zwei Wege möglichEntfernter Zugriff von außerhalb der virtuellen Maschine, in der der Applikationsserver läuft
Beans müssen „Remote Interfaces“ implementierenZugriff über RMI/IIOP (Remote Method Invocation/Internet InterORB Protocol)Argumente und Ergebnisse werden als Werte übergebenDurch Netzwerkübertragung, Marshalling und Demarshalling hoher Overhead; Aufrufe sehr langsam
Lokaler Zugriff innerhalb der virtuellen MaschineBeans müssen „Local Interfaces“ implementierenSehr schnell, da Beans direkt aufgerufen werden könnenArgumente und Ergebnisse werden als Referenzen übergebenEntity Beans: ermöglicht durch den Container verwaltete Relationen
15
Enterprise Application Integration
Björn Eilers
Zugriff auf Entity und Session Beans
Beans über JNDI auffind- und zugreifbarKonvention: Alle Beans unter Wurzel ejb/ ablegenAblauf:1. Erzeugen eines initialen Kontext2. Suchen der Bean im JNDI-Namensraum3. Wenn aufgefunden, Referenz auf Bean holen4. Bean benutzen
16
Enterprise Application Integration
Björn Eilers
Grundlegender Aufbau von Entity und Session Beans
Remote und/oder Local Interfaces: Definieren die Geschäftsmethoden einer BeanErben von javax.ejb.EJBObject bzw. javax.ejb.EJBLocalObject
RemoteHome und/oder LocalHome Interfaces:Definieren Methoden zum Verwalten von Beans Erzeugen, Löschen, Auffinden, Aktivieren und PassierenErben von javax.ejb.EJBHome bzw. javax.ejb.EJBLocalHome
Bean-Klassen:Implementieren die in den Interfaces definierten Geschäfts- und VerwaltungsmethodenMüssen javax.ejb.EntityBean (Entity Beans) bzw. javax.ejb.SessionBean (Session Beans) implementieren
17
Enterprise Application Integration
Björn Eilers
Exkurs: XDoclet
Engine zur Unterstützung von Attribute-Oriented Programming:Source Code-Erzeugung mit Hilfe von Meta-Informationen in JavaDoc-ähnlichen KommentarenAus XDoclet-Tags und Sourcecode Informationen extrahieren, daraus Supportklassen und -dateien generieren
Kommentare auf Klassen-, Methoden und Attributebene möglichDokumentation unter http://xdoclet.sf.net/ Beispiel: Java-Klasse als Enterprise JavaBean deklarieren
/** @ejb.bean name = "Example" * local-jndi-name="ejb/examples/Example" * type="CMP" * cmp-version="2.x" * schema = "Example" */public abstract class ExampleBean { [...] }
18
Enterprise Application Integration
Björn Eilers
Definition von Entity Beans
Bean wird mithilfe von XDoclet Meta-Angaben beschriebenArt der Bean (Entity Bean, CMP)Name der Bean und JNDI-Context, unter dem Bean bereitstehtSchema, als das Bean in EJB-QL angesprochen werden kannArt des Zugriffs: für Entity Beans lokal, sonst kein CMR möglichName des Primärschlüssels
Klasse als abstract deklarieren, muss Interface javax.ejb.EntityBean implementieren
Beinhaltet Methoden zur Verwaltung des Lebenszyklus und des Bean-Umfeldes: ejbActivate, ejbPassivate, ejbLoad, ejbStore, (un)setEntityContext
19
Enterprise Application Integration
Björn Eilers
Definition von Entity Beanspackage lspi.eai.phonebook;
import java.rmi.*;import javax.ejb.*;
/** @ejb.bean name="Entry" * display-name="EntryEB" * description="A phonebook entry" * jndi-name="ejb/Entry" * local-jndi-name="ejb/Entry" * type="CMP" * cmp-version="2.x" * view-type="local" * schema = "Entry" * primkey-field = "id" * * @ejb.persistence table-name = "phonebook_entries" * @jboss.persistence create-table = "true" alter-table = "true" * * @ejb.home local-class = "lspi.eai.phonebook.EntryLocalHome" * @ejb.interface local-class = "lspi.eai.phonebook.EntryLocal" */
public abstract class EntryBean implements EntityBean { [...] }
Definition der Entity Bean
Angaben zur Datenbank
Klassennamen der Local- und LocalHome-Interfaces
20
Enterprise Application Integration
Björn Eilers
Definition von Entity Beans
import java.rmi.*;import javax.ejb.*;
public abstract class EntryBean implements EntityBean {
private EntityContext ctx;
public void ejbActivate() throws EJBException, RemoteException {} public void ejbPassivate() throws EJBException, RemoteException {} public void ejbLoad() throws EJBException, RemoteException {} public void ejbStore() throws EJBException, RemoteException {}
public void setEntityContext(EntityContext ctx) throws EJBException { this.ctx = ctx; }
public void unsetEntityContext() throws EJBException { this.ctx = null; } [...]}
Lebenszyklus der Bean
Umgebung der Bean
21
Enterprise Application Integration
Björn Eilers
Definition von Entity Beans
Methoden zum Erzeugen neuer Entitäten implementierenEine oder mehrere ejbCreate und ejbPostCreate-Methoden (jeweils paarweise); mit XDoclet-Tags als create-Methoden deklarierenejbCreate-Methode füllt Bean mit zugehörigen Daten; Rückgabe vom Typ des Primärschlüssels, jedoch immer null ejbPostCreate-Methode populiert Relationen zu anderen Entity Beans (bei Container-Managed Relationships; erst nach Erzeugung der Bean möglich); Rückgabe ist void
Persistente Felder abstract mit get- und set-Operationen definierenMit XDoclet als persistente Felder deklarieren und Primärschlüssel identifizieren
Zusätzliche Geschäftsmethoden implementieren
22
Enterprise Application Integration
Björn Eilers
Definition von Entity Beans /** @ejb.create-method view-type = "local" */
public Long ejbCreate(String lastname, String firstname, Long dateOfBirth, String phoneNumber) throws CreateException { setId(Long.valueOf(System.nanoTime())); setLastname(lastname); setFirstname(firstname); setDateOfBirth(dateOfBirth); setPhoneNumber(phoneNumber); return null; }
public void ejbPostCreate(String lastname, String firstname, Long dateOfBirth,
String phoneNumber) throws CreateException { // keine Relation zu füllen }
Füllen der Entität mit initialen Werten
Falls notwendig,Erzeugung von Relationen
23
Enterprise Application Integration
Björn Eilers
Definition von Entity Beans /** @ejb.pk-field
* @ejb.persistent-field * @ejb.interface-method view-type="local" */ public abstract Long getId();
/** @ejb.interface-method view-type="local" */ public abstract void setId(Long id);
/** @ejb.persistent-field * @ejb.interface-method view-type="local" */ public abstract String getFirstname(); public abstract void setFirstname(String firstname);
public abstract String getLastname(); public abstract void setLastname(String lastname);
public abstract String getPhonenumber(); public abstract void setPhonenumber(String phonenumber);
public abstract Long getDateOfBirth(); public abstract void setDateOfBirth(Long dateOfBirth);
Definition persistenterFelder
24
Enterprise Application Integration
Björn Eilers
Auffinden von Entity Beans
Geschieht über EJB-QL:Vereinfachtes SQL-Derivat (reine Anfragesprache!)Grundsyntax:SELECT OBJECT(identifier) FROM Schemaname AS identifier [WHERE identifier.feldname = ?1 AND identifier.relation.feldname = ?2]?n: n-ter Parameter der Methodensignatur
Definition von find-Methoden in LocalHome-Interface (Konvention: findByXXX(), findAll())
Methode findByPrimaryKey(PKKlasse primaryKey) immer definiertRückgabekardinalität 0..1: Rückgabetyp ist Local-Interfacez. B. EntryLocal findByName(String lastname, String firstname)Rückgabekardinalität 0..n: Rückgabetyp ist java.util.Collection bzw. java.util.Enumeration
25
Enterprise Application Integration
Björn Eilers
Auffinden von Entity Beans
Mit XDoclet: Definition in Klassenkommentar der Bean-KlasseParameternamen voll qualifiziert angeben (z.B. java.lang.String anstelle von String)
/** * @ejb.finder * signature = "java.util.Collection findAll()" * query = "SELECT OBJECT(e) FROM Entry AS e" * @ejb.finder * signature = "lspi.eai.phonebook.EntryLocal * findByName(java.lang.String lastname, java.lang.String * firstname)" * query = "SELECT OBJECT(e) FROM Entry AS e WHERE e.lastname = ?1 AND * e.firstname = ?2" */
26
Enterprise Application Integration
Björn Eilers
Beziehungen zwischen Entity Beans
CMR zwischen zwei Entity Beans möglich, wenn diese lokale Interfaces benutzen undPersistenz vom Container gemanaged wird
Mögliche KardinalitätenOne-to-One (1:1)One-to-Many (1:n)Many-to-One (n:1)Many-to-Many (n:m)
Können gerichtet oder ungerichtet seinUnidirektional (ausgehende Bean kennt Zielbean, aber nicht umgekehrt)Bidirektional (Beans kennen sich gegenseitig)
27
Enterprise Application Integration
Björn Eilers
Beziehungen zwischen Entity Beans
Relationen sowohl in Quelltext (über get- und set-Methoden) als auch in Deployment Deskriptor definieren (wird von XDoclet übernommen)
Anlegen von Relationenbei X:1: abstrakte get- und set-Methoden vom Typ des Local-Interfaces der Zielbeanbei X:n: abstrakte get- und set-Methoden vom Typ java.util.Collection bzw. java.util.SetDefinition der Relation per XDoclet-Tags (@ejb.relation sowie @jboss.relation)
Bei unidirektionalen Relationen Definition einer "virtuellen" Rückbeziehung
28
Enterprise Application Integration
Björn Eilers
Beziehungen zwischen Entity Beans
public class Example1Bean { [...] /** @ejb.interface-method * view-type = "local" * @ejb.relation * name = "Example1-Example2" * role-name = "Ex1-knows-Ex2" * @jboss.relation * related-pk-field = "example2Id" * fk-column = "fk_example2Id" * fk-constraint = "true" */ public abstract Example2Local
getExample2();
/** @ejb.interface-method * view-type = "local" */ public abstract void
setExample2(Example2 example2); [...]}
public class Example2Bean { [...] /** @ejb.interface-method * view-type = "local" * @ejb.relation * name = "Example1-Example2" * role-name = "Ex2-knows-Ex1" * @jboss.relation * related-pk-field = "example1Id" * fk-column = "fk_example1Id" * fk-constraint = "true" */ public abstract Example1Local
getExample1();
/** @ejb.interface-method * view-type = "local" */ public abstract void
setExample1(Example1 example1); [...]}
Beispiel für eine bidirektionale 1:1-Beziehung
29
Enterprise Application Integration
Björn Eilers
Beziehungen zwischen Entity Beans
public class Example1Bean { [...] /** @ejb.interface-method * view-type = "local" * @ejb.relation * name = "Example1-Example2" * role-name = "Ex1-knows-Ex2" * @jboss.relation * related-pk-field = "example2Id" * fk-column = "fk_example2Id" * fk-constraint = "true" */ public abstract Example2Local getExample2();
/** @ejb.interface-method * view-type = "local" */ public abstract void setExample2(Example2
example2); [...]}
public class Example2Bean { [...]/** @ejb.interface-method * view-type = "local" * @ejb.relation * name = "Example1-Example2" * role-name = "Ex2-knows-Ex1" */ public abstract java.util.Collection
getExamples();
/** @ejb.interface-method * view-type = "local" */ public abstract void
setExamples(java.util.Collection examples);
[...]}
Beispiel für eine bidirektionale 1:n-Beziehung
30
Enterprise Application Integration
Björn Eilers
Beziehungen zwischen Entity Beans
public class Example1Bean { [...] /** @ejb.interface-method * view-type = "local" * @ejb.relation * name = "Example1-Example2" * role-name = "Ex1-has-Ex2" */ public abstract java.util.Collection
getExamples2();
/** * @ejb.interface-method * view-type = "local" */ public abstract void
setExamples2(java.util.Collection examples2);
[...]}
public class Example2Bean { [...] /** @ejb.interface-method * view-type = "local" * @ejb.relation * name = "Example1-Example2" * role-name = "Ex2-has-Ex1" */ public abstract java.util.Collection
getExamples1();
/** * @ejb.interface-method * view-type = "local" */ public abstract void
setExamples1(java.util.Collection examples1);
[...]}
Beispiel für eine bidirektionale n:m-Beziehung
31
Enterprise Application Integration
Björn Eilers
Beziehungen zwischen Entity Beans
public class Example1Bean { [...] /** @ejb.interface-method view-type = "local" * @ejb.relation name = "Example1-Example2" * role-name = "Example1-has-Examples2" * target-ejb = "Example2Bean" * target-role-name = "Example2-referenced-by-Example1" * target-multiple = "no" * @jboss.relation related-pk-field = "example2Id" * fk-column = "fk_example2Id" * fk-constraint = "true" */ public abstract Example2Local getExample2();
/** @ejb.interface-method view-type = "local" */ public abstract void setExample2(Example2Local example2); [...]}
Beispiel für eine unidirektionale 1:(1)-Beziehung
32
Enterprise Application Integration
Björn Eilers
Definition von Session Beans
Definition der Meta-Informationen wieder über XDocletTyp angeben: "Stateless" für zustandslose, "Stateful" für zustandsbehaftete Session BeansIn der Regel keine lokalen, sondern remote Interfaces für Kommunikation mit Bean
Klasse muss javax.ejb.SessionBean implementierenMethoden ejbRemove(), ejbActivate(), ejbPassivate(), setSessionContext(…) für Lebenszyklus- und Umgebungsverwaltung
Bei zustandslosen Beans parameterlose ejbCreate()-Methode, bei zustandsbehafteten Beans ejbCreate(…)-Methoden frei definierbar
33
Enterprise Application Integration
Björn Eilers
Definition von Session Beans
package lspi.eai.phonebook;
import java.rmi.*;import javax.ejb.*;
/** * @ejb.bean name="Phonebook" * display-name="PhonebookSB" * description="Business logic of a phonebook" * jndi-name="ejb/example/Phonebook" * type="Stateless" * view-type="remote" * * @ejb.home remote-class = "lspi.eai.phonebook.PhonebookHome" * @ejb.interface remote-class = "lspi.eai.phonebook.Phonebook" */public class PhonebookBean implements SessionBean { [...]}
Meta-Informationen:Zustandslos, remote
Interfaces sindremote
34
Enterprise Application Integration
Björn Eilers
Definition von Session Beans
Für Zugriff auf Entity Beans und andere Session Beans: lookupXXX()-Methoden erzeugen
Auffinden benötigter Beans im JNDI-Namensdienst
private EntryLocalHome lookupEntryLocalHome() throws NamingException {InitialContext ctx = new InitialContext();try {EntryLocalHome entryHome =
(EntryLocalHome)ctx.lookup("ejb/example/Entry");return entryHome;} finally {if (ctx != null) ctx.close();}
}
35
Enterprise Application Integration
Björn Eilers
Definition von Session Beans
Geschäftsmethoden definierenDa Zugriff remote erfolgt, muss java.rmi.RemoteException geworfen werdenGeschäftsmethode über XDoclet-Tag @ejb.interface-method deklarierenDaten von/für Entity Beans in Data Transfer Objects / Value Objects verpacken
Entity Beans nicht serialisierbarDTO: Einfache JavaBean, die java.io.Serializable implementiert und get- und set-Methoden anbietet
36
Enterprise Application Integration
Björn Eilers
Definition von Session Beans
/** @ejb.interface-method view-type = "remote" */public EntryDTO findEntry(String lastname,
String firstname) throws RemoteException {try {EntryLocalHome entryHome = lookupEntryLocalHome();EntryLocal entry = entryHome.findByName(lastname, firstname);Calendar dateOfBirth = new GregorianCalendar();dateOfBirth.setTimeInMillis(
entry.getDateOfBirth().longValue());EntryDTO entryDTO = new EntryDTO(dateOfBirth, entry.getLastname(), entry.getFirstname(), entry.getPhoneNumber());return entryDTO;} catch (NamingException e) {throw new RemoteException(e.getMessage());} catch (FinderException e) {return null;}
}
37
Enterprise Application Integration
Björn Eilers
Bean Deployment
1. Bean-Klasse implementieren2. XDoclet auf Bean-Klasse anwenden
Generiert Local/Remote- und LocalHome/Home-Interfaces sowie Deployment Deskriptoren
3. Quellen kompilieren4. Kompilierte Klassen und Deployment Deskriptoren in JAR-Datei
packenKlassen mit Packagestruktur übernehmenDeployment-Deskriptoren in Unterverzeichnis META-INF/ packen
5. JAR-Archiv auf dem Server deployenBei lokaler JBoss-Installation in Unterverzeichnis server\default\deploy kopierenFür die Übungen: http://wi-vm215.uni-muenster.de:8080/deployment
38
Enterprise Application Integration
Björn Eilers
Client-ProgrammierungZugriff auf Session Beans über JNDI
Wichtig: jbossall-client.jar, Remote-/RemoteHome-Interfaces und DTO-Klassen im Pfad des Clients!
public PhonebookHome getPhonebookHome() { String JBOSS_HOST = "wi-vm215.uni-muenster.de"; Properties p = new Properties(); p.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); p.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces"); p.setProperty("java.naming.provider.url", JBOSS_HOST); try { InitialContext ctx = new InitialContext(p); phonebookHome = (PhonebookHome)ctx.lookup("ejb/example/Phonebook"); return phonebookHome; } catch (NamingException e) { e.printStackTrace(); }}
39
Enterprise Application Integration
Björn Eilers
Client-Programmierung
Benutzung der Bean im Client:
try { PhonebookHome phonebookHome = getPhonebookHome(); Phonebook phonebook = phonebookHome.create(); EntryDTO entry = phonebook.findEntry("Meyer", "Ute");} catch (CreateException ce) { ce.printStackTrace();} catch (RemoteException re) { re.printStackTrace();}
40
Enterprise Application Integration
Björn Eilers
EAI mit J2EE
Anbindung J2EE-fremder Systeme auf zwei ArtenÜber CORBA
Java-Interfaces der Beans (insb. Session Beans) in CORBA-IDL abbildenVerbindung über IIOP-Protokoll möglichUnterstützung für Authentifizierung/Autorisation, VerschlüsselungTransaktionssicherheit Hoher Implementierungsaufwand
Über Web ServicesSeit J2EE v1.4/EJB 2.1: Stateless Session Beans als Web Service EndpunkteVerbindung mit WS über SOAPAuthentifizierung/Autorisation, Verschlüsselung, Sitzungsverfolgung möglich, aber aufwändigRelativ einfach zu implementieren
41
Enterprise Application Integration
Björn Eilers
EAI mit J2EE: Session Bean als Web Service
1. Service Endpoint Interface (SEI) definierenenthält durch WS bereitgestellte Geschäftsmethoden kann weniger Methoden anbieten, als Bean bereitstelltInterface erweitert java.rmi.RemoteMethoden müssen java.rmi.RemoteException werfen
package lspi.eai.phonebook;import java.rmi.*;public interface PhonebookSEI extends Remote { public EntryDTO findEntry(String lastname, String firstname) throws RemoteException; public EntryDTO[] findEntries() throws RemoteException; public void addEntry(EntryDTO entry) throws RemoteException;}
42
Enterprise Application Integration
Björn Eilers
EAI mit J2EE: Session Bean als Web Service
2. Deployment Descriptor ejb-jar.xml aktualisierenHinzufügen eines <service-endpoint>-Tags unter /ejb-jar/enterprise-beans/session
<ejb-jar [...]> <enterprise-beans> <session > <description><![CDATA[Business logic of a phonebook]]></description> <display-name>PhonebookSB</display-name> <ejb-name>Phonebook</ejb-name> <home>lspi.eai.phonebook.PhonebookHome</home> <remote>lspi.eai.phonebook.Phonebook</remote> <service-endpoint>lspi.eai.phonebook.PhonebookSEI</service-endpoint> <ejb-class>lspi.eai.phonebook.PhonebookBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans></ejb-jar>
43
Enterprise Application Integration
Björn Eilers
EAI mit J2EE: Session Bean als Web Service
3. WSDL-Datei und Meta-Informationen für Web Service aus Service Endpoint Interface generieren
benötigt wscompile aus dem Java Web Services Developer Pack 2erzeugt Hilfsklassen, WSDL- und Mapping-Dokumente (bildet Java-Datentypen auf Web Service-Elemente ab)
44
Enterprise Application Integration
Björn Eilers
EAI mit J2EE: Session Bean als Web Service
4. Speziellen Web Service-Descriptor webservices.xml definieren<webservices> <webservice-description> <webservice-description-name>PhonebookService</webservice-description-name> <wsdl-file>META-INF/wsdl/PhonebookService.wsdl</wsdl-file> <jaxrpc-mapping-file>META-INF/PhonebookService_mapping.xml</jaxrpc-mapping-
file> <port-component> <port-component-name>PhonebookService</port-component-name> <wsdl-port>PhonebookSEIPort</wsdl-port> <service-endpoint-interface>lspi.eai.phonebook.PhonebookSEI</service-
endpoint-interface> <service-impl-bean> <ejb-link>Phonebook</ejb-link> </service-impl-bean> </port-component> </webservice-description></webservices>
45
Enterprise Application Integration
Björn Eilers
EAI mit J2EE: Session Bean als Web Service
5. Beans und Deployment Deskriptoren in JAR-Archiv packenWSDL-Datei in Verzeichnis META-INF/wsdlwebservices.xml und Mapping-Datei nach META-INF
6. JAR-Datei deployenBei lokaler Installation wieder nach server/default/deployAnsonsten über das Web-Interface hochladenInstallation kann über http://localhost:8080/ws4ee überprüft werden (bzw. über Web-Interface)
7. Ansprechen des Web Services über AxisGenerierung der Client-Dateien wie in WS-Vorlesung mithilfe von WSDL2Java
46
Enterprise Application Integration
Björn Eilers
Telefonbuch-Beispiel
Telefonbuch-Beispiel mit Schritt-für-Schritt-Anleitung im Netz unter
http://www.wi.uni-muenster.de/pi/lehre/ss06/EAI/j2ee_jboss.php
+findEntry( lastname : String, firstname : String )+createNewEntry( entry : EntryDTO )
+getEntries()
<<SessionBean>>Phonebook
<<EntityBean>>Entry
-telephoneNumber : String-dateOfBirth : long-firstname : String-lastname : String-id : long
<<ValueObject>>EntryDTO
-telephoneNumber : String-dateOfBirth : Calendar-firstname : String-lastname : String-id : long
PhonebookGUI
+...()
-phonebook1-entries0..*
47
Enterprise Application Integration
Björn Eilers
Literatur
Roman, E., et. al.: Mastering Enterprise JavaBeans, Third Editionhttp://www.theserverside.com/books/wiley/masteringEJB/index.tss
Engel, A., Koschel., A., Tritsch, R.: J2EE kompakt, Spektrum Akademischer Verlag 2002Guter Einstieg in die Materie, obwohl z. T. überholt
J2EE Specification 1.4 / EJB Specification 2.1http://java.sun.com/j2ee/1.4/docs/#specs
Technische Kurzdokumentationen zu J2EEhttp://www.torsten-horn.de/techdocs/#JEE (einführende Beispiel in J2EE)