Enterprise Application Integration - Department of Information Systems

Werbung
Enterprise Application Integration
EAI mit der Java 2 Enterprise Edition
und Enterprise JavaBeans
Enterprise Application Integration
Björn Eilers
Prozessmanagement
Nachrichtenmanagement
Physisches Netzwerk
Enterprise Application Integration
2
Björn Eilers
Adapter
Adapter
Adapter
Adapter
Adapter
Adapter
Middleware
Java 2 Enterprise Edition
Metadatenbank für Zusatzdienste
Einordnung in funktionale Bestandteile einer EAI Infrastruktur
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 Plattform
Flexible Implementierung von Geschäftsprozessen über wiederverwendbare
Komponenten (Enterprise JavaBeans)
Enterprise Application Integration
3
Björn Eilers
Java 2 Enterprise Edition
Enterprise Application Integration
4
Björn Eilers
Java 2 Enterprise Edition
Spezifikationsvorgaben in J2EE-Anwendungsservern
implementiert
Laufzeitumgebung für J2EE Komponenten, die die J2EE Spezifikation erfüllt
Logische Aufteilung in Container (Web-Container, EJB-Container)
Muss, um Spezifikation zu erfüllen, diverse Dienste anbieten
Dienste eines J2EE-Anwendungsservers:
Webserver
Sicherheitsdienste (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)
Enterprise Application Integration
5
Björn Eilers
J2EE-Komponenten
Servlets
Java-Klassen, die HTTP-Anfragen verarbeiten und HTTP-Antworten
erstellen
i.d.R. Controller-Komponenten für Webanwendungen, manchmal auch View
Alternativ als Gateway für HTTP-basierenden Protokolle verwendet
Java Server Pages / Java Server Faces
Markup-Dateien, die neben HTML-/XML-Tags auch Java-Code und spezielle
JSP-/JSF-Tags enthalten
werden als Servlet kompiliert
View-Komponenten für Webanwendungen
Enterprise Application Integration
6
Björn Eilers
J2EE-Komponenten
Enterprise JavaBeans
Kapseln Geschäftslogik, Daten und Nachrichtenverarbeitung für
unternehmensweite Anwendungen
Werden 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. Applets
Bieten als Client Zugriff auf die Serverfunktionen an.
Enterprise Application Integration
7
Björn Eilers
Architektur
Üblicherweise Aufteilung in vier Schichten
1.
2.
3.
4.
Clients (Browser, Thin Clients)
Präsentationslogik (JSP/JSF, Servlets)
Geschäftslogik (Enterprise JavaBeans)
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
Enterprise Application Integration
8
Björn Eilers
Architektur
HTTP
JSP
/
JSF
Browser
Session Bean
Servlets
HTTP
Mobiltelefon
SOAP
Firewall
RMI/IIOP
Fat Client
Web
Service
Endpunkt
Session Bean
EJB Container
Web Container
Basisdienste
Sicherheit
Web
Services
XMLDienste
JMS
JavaMail
JAF
JTA/JTS
JDBC
Entity Bean
Datenbank
Web Service
Client
Message
Queue
Message-driven
Bean
Entity Bean
Datenbank
Externes System
J2EE Applikationsserver
Enterprise Application Integration
9
Björn Eilers
Enterprise JavaBeans
Komponenten zur Implementierung von Geschäftsprozessen,
Daten und Nachrichtenverarbeitung
Entity Beans
Daten für unternehmensrelevante Geschäftsobjekte
Werden in persistentem Speicher gesichert (i.d.R. Datenbank)
Bean-managed Persistence: Bean kümmert sich selber um ihre Persistenz
Container-managed Persistence:
Container kümmert sich um Persistenz
ermö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 nutzbar
z. B. Bankkonto, Flugreservierung, Kundendaten
Enterprise Application Integration
10
Björn Eilers
Enterprise JavaBeans
Session Beans
Implementierung von Geschäftsprozessen als Dienst
Zustandslos:
Für simple Geschäftsprozesse; kann von mehreren Clients gleichzeitig benutzt
werden
Keine Daten zwischen Methodenaufrufen gespeichert, arbeiten nur auf
übergebenen Daten
Können ab EJB 2.1 Dienste auch als Web Service anbieten
z. B. Geldentnahme von Bankkonto
Zustandsbehaftet:
Speichern Daten über mehrere Methodenaufrufe
Methodenaufrufe können Zustand der Bean verändern
nur von einem Client nutzbar; Daten nicht persistent
z. B. Veränderung eines Warenkorbs bei Online-Einkauf
Enterprise Application Integration
11
Björn Eilers
Enterprise JavaBeans
Message-Driven Beans
Stellt einen Nachrichtenempfänger dar (nicht automatisch auch einen
Sender!)
Serverseitige Geschäftslogik für Verarbeitung asynchroner Nachrichten
Bietet auf Wunsch Zustellungsgarantie (Ausfall des Systems sorgt nicht für
Verlust der Nachricht)
Client kommuniziert nur über Nachrichtenaustausch, Bean „lauscht“ auf das
Eintreffen neuer Nachrichten
z. B. Datenabgleich zwischen zwei Filialen, Ausführung eines Workflows
Werden in nächster Veranstaltung detailliert vorgestellt
Enterprise Application Integration
12
Björn Eilers
Enterprise JavaBeans
Weiterhin für Deployment von Enterprise JavaBeans benötigt:
Deployment Deskriptoren
XML-Dokumente zur Beschreibung der Bean-Klassen und -Interfaces, der
Bean-Eigenschaften sowie zur Konfiguration der Bean im Applikationsserver
Ein herstellerunabhängiger Deskriptor (ejb-jar.xml), ein oder mehrere
herstellerabhängige Deskriptoren (jboss.xml, sun-ejb-jar.xml, …), um serverund datenbankspezifische Eigenschaften zu definieren
JAR-Archive mit Deployment Descriptoren, kompilierten Klassen
und Interfaces sowie benötigten Bibliotheken
Enterprise Application Integration
13
Björn Eilers
Zugriff auf Entity und Session Beans
Zugriff auf Entity und Session Beans über zwei Wege möglich
Entfernter Zugriff von außerhalb der virtuellen Maschine, in der der
Applikationsserver läuft
Beans müssen „Remote Interfaces“ implementieren
Zugriff über RMI/IIOP (Remote Method Invocation/Internet InterORB
Protocol)
Argumente und Ergebnisse werden als Werte übergeben
Durch Netzwerkübertragung, Marshalling und Demarshalling hoher
Overhead; Aufrufe sehr langsam
Lokaler Zugriff innerhalb der virtuellen Maschine
Beans müssen „Local Interfaces“ implementieren
Sehr schnell, da Beans direkt aufgerufen werden können
Argumente und Ergebnisse werden als Referenzen übergeben
Entity Beans: ermöglicht durch den Container verwaltete Relationen
Enterprise Application Integration
14
Björn Eilers
Zugriff auf Entity und Session Beans
Beans über JNDI auffind- und zugreifbar
Konvention: Alle Beans unter Wurzel ejb/ ablegen
Ablauf:
1.
2.
3.
4.
Erzeugen eines initialen Kontext
Suchen der Bean im JNDI-Namensraum
Wenn aufgefunden, Referenz auf Bean holen
Bean benutzen
Enterprise Application Integration
15
Björn Eilers
Grundlegender Aufbau von Entity und Session Beans
Remote und/oder Local Interfaces:
Definieren die Geschäftsmethoden einer Bean
Erben 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 Passieren
Erben von javax.ejb.EJBHome bzw. javax.ejb.EJBLocalHome
Bean-Klassen:
Implementieren die in den Interfaces definierten Geschäfts- und
Verwaltungsmethoden
Müssen javax.ejb.EntityBean (Entity Beans) bzw. javax.ejb.SessionBean
(Session Beans) implementieren
Enterprise Application Integration
16
Björn Eilers
Exkurs: XDoclet
Engine zur Unterstützung von Attribute-Oriented Programming:
Source Code-Erzeugung mit Hilfe von Meta-Informationen in JavaDocähnlichen Kommentaren
Aus XDoclet-Tags und Sourcecode Informationen extrahieren, daraus
Supportklassen und -dateien generieren
Kommentare auf Klassen-, Methoden und Attributebene möglich
Dokumentation 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 { [...] }
Enterprise Application Integration
17
Björn Eilers
Definition von Entity Beans
Bean wird mithilfe von XDoclet Meta-Angaben beschrieben
Art der Bean (Entity Bean, CMP)
Name der Bean und JNDI-Context, unter dem Bean bereitsteht
Schema, als das Bean in EJB-QL angesprochen werden kann
Art des Zugriffs: für Entity Beans lokal, sonst kein CMR möglich
Name des Primärschlüssels
Klasse als abstract deklarieren, muss Interface
javax.ejb.EntityBean implementieren
Beinhaltet Methoden zur Verwaltung des Lebenszyklus und des BeanUmfeldes: ejbActivate, ejbPassivate, ejbLoad, ejbStore,
(un)setEntityContext
Enterprise Application Integration
18
Björn Eilers
Definition von Entity Beans
package lspi.eai.phonebook;
import java.rmi.*;
import javax.ejb.*;
/** @ejb.bean name="Entry"
*
display-name="EntryEB"
*
description="A phonebook entry"
*
jndi-name="ejb/Entry"
Definition der Entity Bean
*
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"
Angaben zur Datenbank
* @jboss.persistence create-table = "true" alter-table = "true"
*
Klassennamen
* @ejb.home local-class = "lspi.eai.phonebook.EntryLocalHome"
* @ejb.interface local-class = "lspi.eai.phonebook.EntryLocal" */ der Local- und
public abstract class EntryBean implements EntityBean { [...] }
Enterprise Application Integration
19
Björn Eilers
LocalHomeInterfaces
Definition von Entity Beans
import java.rmi.*;
import javax.ejb.*;
public abstract class EntryBean implements EntityBean {
private EntityContext ctx;
public
public
public
public
void
void
void
void
Lebenszyklus der Bean
ejbActivate() throws EJBException, RemoteException {}
ejbPassivate() throws EJBException, RemoteException {}
ejbLoad() throws EJBException, RemoteException {}
ejbStore() throws EJBException, RemoteException {}
public void setEntityContext(EntityContext ctx) throws EJBException {
this.ctx = ctx;
}
public void unsetEntityContext() throws EJBException {
this.ctx = null;
}
[...]
}
Enterprise Application Integration
20
Björn Eilers
Umgebung der Bean
Definition von Entity Beans
Methoden zum Erzeugen neuer Entitäten implementieren
Eine oder mehrere ejbCreate und ejbPostCreate-Methoden (jeweils
paarweise); mit XDoclet-Tags als create-Methoden deklarieren
ejbCreate-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 definieren
Mit XDoclet als persistente Felder deklarieren und Primärschlüssel
identifizieren
Zusätzliche Geschäftsmethoden implementieren
Enterprise Application Integration
21
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);
Füllen der Entität mit
setDateOfBirth(dateOfBirth);
initialen Werten
setPhoneNumber(phoneNumber);
return null;
}
Falls notwendig,
public void ejbPostCreate(String lastname,
Erzeugung von
String firstname,
Long dateOfBirth,
Relationen
String phoneNumber) throws CreateException {
// keine Relation zu füllen
}
Enterprise Application Integration
22
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);
Definition persistenter
public abstract String getLastname();
Felder
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);
Enterprise Application Integration
23
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 definiert
Rückgabekardinalität 0..1: Rückgabetyp ist Local-Interface
z. B. EntryLocal findByName(String lastname, String firstname)
Rückgabekardinalität 0..n: Rückgabetyp ist java.util.Collection bzw.
java.util.Enumeration
Enterprise Application Integration
24
Björn Eilers
Auffinden von Entity Beans
Mit XDoclet: Definition in Klassenkommentar der Bean-Klasse
Parameternamen 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"
*/
Enterprise Application Integration
25
Björn Eilers
Beziehungen zwischen Entity Beans
CMR zwischen zwei Entity Beans möglich, wenn diese
lokale Interfaces benutzen und
Persistenz vom Container gemanaged wird
Mögliche Kardinalitäten
One-to-One (1:1)
One-to-Many (1:n)
Many-to-One (n:1)
Many-to-Many (n:m)
Können gerichtet oder ungerichtet sein
Unidirektional (ausgehende Bean kennt Zielbean, aber nicht umgekehrt)
Bidirektional (Beans kennen sich gegenseitig)
Enterprise Application Integration
26
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 Relationen
bei X:1: abstrakte get- und set-Methoden vom Typ des Local-Interfaces der
Zielbean
bei X:n: abstrakte get- und set-Methoden vom Typ java.util.Collection bzw.
java.util.Set
Definition der Relation per XDoclet-Tags (@ejb.relation sowie
@jboss.relation)
Bei unidirektionalen Relationen Definition einer "virtuellen" Rückbeziehung
Enterprise Application Integration
27
Björn Eilers
Beziehungen zwischen Entity Beans
Beispiel für eine bidirektionale 1:1-Beziehung
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();
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
setExample2(Example2 example2);
[...]
}
/** @ejb.interface-method
*
view-type = "local" */
public abstract void
setExample1(Example1 example1);
[...]
}
Enterprise Application Integration
28
Björn Eilers
Beziehungen zwischen Entity Beans
Beispiel für eine bidirektionale 1:n-Beziehung
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);
[...]
}
Enterprise Application Integration
29
Björn Eilers
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);
[...]
}
Beziehungen zwischen Entity Beans
Beispiel für eine bidirektionale n:m-Beziehung
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();
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
setExamples2(java.util.Collection
examples2);
[...]
/**
* @ejb.interface-method
*
view-type = "local" */
public abstract void
setExamples1(java.util.Collection
examples1);
[...]
}
}
Enterprise Application Integration
30
Björn Eilers
Beziehungen zwischen Entity Beans
Beispiel für eine unidirektionale 1:(1)-Beziehung
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);
[...]
}
Enterprise Application Integration
31
Björn Eilers
Definition von Session Beans
Definition der Meta-Informationen wieder über XDoclet
Typ angeben: "Stateless" für zustandslose, "Stateful" für zustandsbehaftete
Session Beans
In der Regel keine lokalen, sondern remote Interfaces für Kommunikation mit
Bean
Klasse muss javax.ejb.SessionBean implementieren
Methoden ejbRemove(), ejbActivate(), ejbPassivate(), setSessionContext(…)
für Lebenszyklus- und Umgebungsverwaltung
Bei zustandslosen Beans parameterlose ejbCreate()-Methode, bei
zustandsbehafteten Beans ejbCreate(…)-Methoden frei definierbar
Enterprise Application Integration
32
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"
Meta-Informationen:
*
type="Stateless"
Zustandslos, remote
*
view-type="remote"
*
* @ejb.home remote-class = "lspi.eai.phonebook.PhonebookHome"
* @ejb.interface remote-class = "lspi.eai.phonebook.Phonebook"
*/
Interfaces sind
public class PhonebookBean implements SessionBean {
remote
[...]
}
Enterprise Application Integration
33
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();
}
}
Enterprise Application Integration
34
Björn Eilers
Definition von Session Beans
Geschäftsmethoden definieren
Da Zugriff remote erfolgt, muss java.rmi.RemoteException geworfen
werden
Geschäftsmethode über XDoclet-Tag @ejb.interface-method deklarieren
Daten von/für Entity Beans in Data Transfer Objects / Value Objects
verpacken
Entity Beans nicht serialisierbar
DTO: Einfache JavaBean, die java.io.Serializable implementiert und get- und
set-Methoden anbietet
Enterprise Application Integration
35
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;
}
}
Enterprise Application Integration
36
Björn Eilers
Bean Deployment
1. Bean-Klasse implementieren
2. XDoclet auf Bean-Klasse anwenden
Generiert Local/Remote- und LocalHome/Home-Interfaces sowie
Deployment Deskriptoren
3. Quellen kompilieren
4. Kompilierte Klassen und Deployment Deskriptoren in JAR-Datei
packen
Klassen mit Packagestruktur übernehmen
Deployment-Deskriptoren in Unterverzeichnis META-INF/ packen
5. JAR-Archiv auf dem Server deployen
Bei lokaler JBoss-Installation in Unterverzeichnis server\default\deploy
kopieren
Für die Übungen: http://wi-vm215.uni-muenster.de:8080/deployment
Enterprise Application Integration
37
Björn Eilers
Client-Programmierung
Zugriff 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();
}
}
Enterprise Application Integration
38
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();
}
Enterprise Application Integration
39
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 abbilden
Verbindung über IIOP-Protokoll möglich
Unterstützung für Authentifizierung/Autorisation, Verschlüsselung
Transaktionssicherheit
Hoher Implementierungsaufwand
Über Web Services
Seit J2EE v1.4/EJB 2.1: Stateless Session Beans als Web Service
Endpunkte
Verbindung mit WS über SOAP
Authentifizierung/Autorisation, Verschlüsselung, Sitzungsverfolgung möglich,
aber aufwändig
Relativ einfach zu implementieren
Enterprise Application Integration
40
Björn Eilers
EAI mit J2EE: Session Bean als Web Service
1. Service Endpoint Interface (SEI) definieren
enthält durch WS bereitgestellte Geschäftsmethoden
kann weniger Methoden anbieten, als Bean bereitstellt
Interface erweitert java.rmi.Remote
Methoden 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;
}
Enterprise Application Integration
41
Björn Eilers
EAI mit J2EE: Session Bean als Web Service
2. Deployment Descriptor ejb-jar.xml aktualisieren
Hinzufügen eines <service-endpoint>-Tags unter /ejb-jar/enterprisebeans/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>
Enterprise Application Integration
42
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 2
erzeugt Hilfsklassen, WSDL- und Mapping-Dokumente (bildet JavaDatentypen auf Web Service-Elemente ab)
Enterprise Application Integration
43
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-mappingfile>
<port-component>
<port-component-name>PhonebookService</port-component-name>
<wsdl-port>PhonebookSEIPort</wsdl-port>
<service-endpoint-interface>lspi.eai.phonebook.PhonebookSEI</serviceendpoint-interface>
<service-impl-bean>
<ejb-link>Phonebook</ejb-link>
</service-impl-bean>
</port-component>
</webservice-description>
</webservices>
Enterprise Application Integration
44
Björn Eilers
EAI mit J2EE: Session Bean als Web Service
5. Beans und Deployment Deskriptoren in JAR-Archiv packen
WSDL-Datei in Verzeichnis META-INF/wsdl
webservices.xml und Mapping-Datei nach META-INF
6. JAR-Datei deployen
Bei lokaler Installation wieder nach server/default/deploy
Ansonsten über das Web-Interface hochladen
Installation kann über http://localhost:8080/ws4ee überprüft werden (bzw.
über Web-Interface)
7. Ansprechen des Web Services über Axis
Generierung der Client-Dateien wie in WS-Vorlesung mithilfe von
WSDL2Java
Enterprise Application Integration
45
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
<<EntityBean>>
Entry
-id : long
-lastname : String
-firstname : String
-dateOfBirth : long
-telephoneNumber : String
<<ValueObject>>
EntryDTO
<<SessionBean>>
Phonebook
+createNew Entry( entry : EntryDTO )
+findEntry( lastname : String, firstname : String )
+getEntries()
1
-id : long
-lastname : String
-firstname : String
-dateOfBirth : Calendar
-telephoneNumber : String
-phonebook
0..*
PhonebookGUI
+...()
Enterprise Application Integration
46
Björn Eilers
-entries
Literatur
Roman, E., et. al.: Mastering Enterprise JavaBeans, Third Edition
http://www.theserverside.com/books/wiley/masteringEJB/index.tss
Engel, A., Koschel., A., Tritsch, R.: J2EE kompakt, Spektrum
Akademischer Verlag 2002
Guter Einstieg in die Materie, obwohl z. T. überholt
J2EE Specification 1.4 / EJB Specification 2.1
http://java.sun.com/j2ee/1.4/docs/#specs
Technische Kurzdokumentationen zu J2EE
http://www.torsten-horn.de/techdocs/#JEE (einführende Beispiel in J2EE)
Enterprise Application Integration
47
Björn Eilers
Herunterladen