06.11.2013 Aufrufe

Paper (PDF) - STS

Paper (PDF) - STS

Paper (PDF) - STS

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Portabilität von Java-Software:<br />

Eine Untersuchung am Beispiel von Application-Servern<br />

und dem EJB-Standard<br />

DIPLOMARBEIT<br />

Celal Akçiçek<br />

Fachbereich Informatik<br />

UNIVERSITÄT HAMBURG<br />

Betreuung:<br />

Prof. Dr. Joachim W. Schmidt,<br />

Arbeitsbereich Softwaresysteme<br />

TECHNISCHE UNIVERSITÄT HAMBURG-HARBURG<br />

Dr. Martin Lehmann,<br />

Fachbereich Informatik<br />

UNIVERSITÄT HAMBURG<br />

20. November 2002


Zusammenfassung<br />

Die objektorientierte Programmiersprache Java erfreut sich immer größerer Beliebtheit. Die<br />

Ursachen für diesen Erfolg sind nicht nur in den Applets und in den objektorientierten Fähigkeiten<br />

dieser Sprache zu suchen (das objektorientierte Programmierparadigma besteht<br />

bereits seit Ende der sechziger Jahre ), sondern auch in der Plattformunabhängigkeit von Java.<br />

Durch die Plattformunabhängigkeit ergeben sich zahlreiche Vorteile, wie z.B. die Portabilität.<br />

Bisher gab es keine Möglichkeit, portable serverseitige Komponenten in Java zu entwickeln.<br />

Dieses Manko soll durch das von Sun eingeführte serverseitige Komponentenmodell – das<br />

Enterprise JavaBeans Komponentenmodell – behoben werden. Alle nach der EJB-Spezifikation<br />

entworfenen Komponenten sollen ohne jegliche Modifikation in EJB konformen Servern<br />

lauffähig sein. Diese Arbeit untersucht das Enterprise JavaBeans Komponentenmodell speziell<br />

im Hinblick auf die Portabilität der EJB Komponenten.<br />

I


An dieser Stelle möchte ich Herrn Prof. Dr. Joachim W. Schmidt<br />

und Herrn Dr. Martin Lehmann für die Betreuung dieser Arbeit danken.<br />

I


Inhaltsverzeichnis<br />

1 Einleitung 1<br />

1.1 Ziel der Arbeit . . ................................... 2<br />

1.2 Gliederung der Arbeit . . .............................. 2<br />

2 Portabilität 4<br />

2.1 Die Programmiersprache Java ............................ 5<br />

2.2 Portabilität von Software . .............................. 7<br />

2.3 Vor- und Nachteile der Portabilität . ........................ 7<br />

2.4 Marktwirtschaftliche Gesichtspunkte der Portabilität . ............. 8<br />

3 Komponentenmodelle 9<br />

3.1 Verteilte Anwendungen . .............................. 9<br />

3.2 Komponenten . . ................................... 10<br />

3.3 Problemklassen . ................................... 12<br />

3.4 JavaBeans ....................................... 13<br />

3.5 Enterprise JavaBeans . . . .............................. 13<br />

3.6 COM .......................................... 15<br />

3.7 Vergleich der Komponentenmodelle ........................ 16<br />

4 Enterprise JavaBeans Komponentenmodell 18<br />

4.1 Bean-Arten ....................................... 18<br />

4.2 Persistenz von EJB-Komponenten . . ........................ 20<br />

4.3 Aufbau der EJB-Arten . . .............................. 21<br />

4.4 Angebotene Dienste . . . .............................. 23<br />

4.5 EJB-Container . . ................................... 24<br />

II


INHALTSVERZEICHNIS<br />

III<br />

4.6 Transaktionen . . ................................... 24<br />

4.7 EJB-Rollen ....................................... 25<br />

4.7.1 EJB Server-Provider ............................. 25<br />

4.7.2 EJB Container-Provider . . . ........................ 25<br />

4.7.3 Bean-Provider . . . .............................. 25<br />

4.7.4 Application-Assembler . . . ........................ 26<br />

4.7.5 Deployer . ................................... 26<br />

4.7.6 System-Administrator ............................ 26<br />

4.8 Deployment-Deskriptor . .............................. 27<br />

4.9 Portabilität und Enterprise JavaBeans ....................... 27<br />

4.10 Java 2 Plattform, Enterprise Edition . ........................ 27<br />

5 Application-Server 32<br />

5.1 Evolution der Anwendungssystem-Architekturen . . . ............. 32<br />

5.1.1 Großrechner Architektur . . . ........................ 33<br />

5.1.2 Client-Server Architektur . . ........................ 34<br />

5.1.3 Mehrschichten Architektur . ........................ 36<br />

5.2 Angebotene Dienste . . . .............................. 37<br />

5.2.1 Authentifizierung . .............................. 40<br />

5.2.2 Skalierbarkeit . . . .............................. 40<br />

5.2.3 Lastausgleich und Ausfallsicherheit . ................... 40<br />

5.2.4 Transaktionssteuerung ............................ 40<br />

5.2.5 Datenbankzugriff . .............................. 40<br />

5.2.6 Zustands- und Sitzungssteuerung . . ................... 41<br />

5.2.7 HTML-Generierung ............................. 41<br />

6 Installation einer Beispielanwendung in EJB-Servern 42<br />

6.1 Beispielanwendung .................................. 42<br />

6.1.1 EJB-Komponenten der Beispielanwendung . . . ............. 47<br />

6.2 Beschreibung der Entwicklungs- und Testumgebung . ............. 50<br />

6.3 Vorstellung der Vergleichskriterien . ........................ 53<br />

6.4 BEA WebLogic Application-Server . ........................ 55


6.4.1 Installation der EJB-Beispielanwendung .................. 55<br />

6.4.2 Test der EJB-Komponente . . ........................ 56<br />

6.4.3 Umsetzung des EJB-Rollenkonzepts . ................... 56<br />

6.5 SilverStream Application-Server . . ........................ 56<br />

6.5.1 Installation der EJB-Beispielanwendung ................. 57<br />

6.5.2 Test der EJB-Komponenten . ........................ 57<br />

6.5.3 Umsetzung des EJB-Rollenkonzepts . ................... 58<br />

6.6 Borland Application-Server ............................. 58<br />

6.6.1 Installation der EJB-Beispielanwendung .................. 59<br />

6.6.2 Test der EJB-Komponente . . ........................ 59<br />

6.6.3 Umsetzung des EJB-Rollenkonzepts . ................... 59<br />

6.7 Auswertung der Vergleichskriterien ........................ 60<br />

7 Abbildung eines Objekt-Modells auf ein EJB-Modell 61<br />

7.1 Generelle Abbildungsprobleme . . . ........................ 61<br />

7.2 EJB-Komponenten basierend auf künstlichen Primärschlüssel . . ....... 64<br />

7.3 EJB-Komponenten basierend auf Java-Objektidentität . ............. 66<br />

7.4 Vergleich der Lösungen . .............................. 68<br />

8 Zusammenfassung und Ausblick 70<br />

8.1 Zusammenfassung .................................. 70<br />

8.2 Ausblick ........................................ 71<br />

IV


Abbildungsverzeichnis<br />

4.1 Beispiel eines Deployment-Deskriptors . . . ................... 28<br />

4.2 Bestandteile einer J2EE Anwendung ........................ 29<br />

4.3 Überblick der J2EE Architektur . . . ........................ 31<br />

5.1 Großrechner Architektur . .............................. 33<br />

5.2 Client-Server Architektur .............................. 34<br />

5.3 Drei-Schichten Architektur .............................. 37<br />

5.4 Ohne Einsatz eines Application-Servers . . . ................... 38<br />

5.5 Mit Einsatz eines Application-Servers ....................... 39<br />

6.1 UML-Klassendiagramm der Beispielanwendung ................. 44<br />

6.2 UML-Klassendiagramm des Kompositions Entwurfsmusters . . . ....... 45<br />

6.3 Ausschnitt der Klasse ElementaryWork . . . ................... 46<br />

6.4 UML-Klassendiagramm der Beispielanwendung mit EJB-Komponenten . . . 47<br />

6.5 Home-Interface der Entity-Bean . . . ........................ 49<br />

6.6 Remote-Interface der Entity-Bean . . ........................ 49<br />

6.7 Deployment-Deskriptor der Beispielanwendung ................. 51<br />

6.8 Zentrale Verzeichnis-Klasse ............................. 52<br />

6.9 Java-Programm zum Testen der Entity-Bean ................... 54<br />

V


Tabellenverzeichnis<br />

3.1 Komponentenmodelle im Vergleich . ........................ 17<br />

4.1 Unterscheidungskriterien zwischen Session- und Entity-Beans . . ....... 20<br />

6.1 Auswertung der Vergleichskriterien ........................ 60<br />

VI


VII


Kapitel 1<br />

Einleitung<br />

In der heutigen Zeit wird bei der Entwicklung von Anwendungen häufig ein Application-<br />

Server eingesetzt. Ein Application-Server ist eine Software, die bestimmte Dienste bereitstellt,<br />

um den Entwickler von Routine-Aufgaben wie z.B. dem Transaktionsmanagement,<br />

die Integration von Datenbanksystemen und von der Programmierung von Sicherheitsmechanismen<br />

zu entlasten.<br />

Jeder Hersteller eines Application-Servers besitzt bisher ein eigenes Rahmenwerk, um verteilte<br />

Anwendungen zu entwickeln. Zahlreiche Basisdienste werden durch das Rahmenwerk<br />

und dem Application-Server bereitgestellt. Die Anwendungsentwickler verwenden beim<br />

Einsatz solcher Rahmenwerke einen Großteil ihrer Zeit für die Implementierung folgender<br />

Programmteile, wenn die vom Application-Server bereitgestellten Basisdienste die Anforderungen<br />

der Anwendung bzw. der Anwendungsentwickler nicht erfüllen:<br />

• Netzwerkkommunikation<br />

• Transaktionen<br />

• Datenbankanbindung<br />

• Objekt-Relationales Mapping<br />

Für die Implementierung der Anwendungslogik wird in solch einem Fall zwangsläufig weniger<br />

Zeit aufgewendet.<br />

Im Falle eines Wechsels des Application-Servers ist jedoch viel Umprogrammierung sowie<br />

Neuprogrammierung bestimmter Programmteile notwendig, da jeder Hersteller sein eigenes<br />

Rahmenwerk zur Programmentwicklung besitzt.<br />

Ein weiteres Problem ist, daß die Geschäftskomponenten der Anwendung nicht zwischen<br />

den Application-Servern verschiedener Hersteller portabel sind. Die von [Sun ] eingeführte<br />

Enterprise JavaBeans Spezifikation [Matena, Hapner 99] versucht diese Problematik der Portabilität<br />

von Geschäftskomponenten durch die Einführung der Enterprise JavaBeans Komponenten<br />

zu lösen. Durch dieses neue Modell soll es möglich sein, den Hersteller zu wechseln,<br />

ohne die Geschäftskomponenten modifizieren zu müssen. Zusätzlich soll durch den<br />

Einsatz des Enterprise JavaBeans Komponentenmodells der Anwendungsentwickler von<br />

1


KAPITEL 1. EINLEITUNG 2<br />

der Programmierung der oben ausfgeführten Basisdienste (Netzwerkkommunikation, Transaktionen<br />

usw.) befreit werden, so daß er sich voll auf die Anwendungslogik und die Geschäftskomponenten<br />

konzentrieren kann.<br />

Zum Zeitpunkt dieser Arbeit ist die Enterprise JavaBeans-Spezifikation in der Version 1.1 die<br />

aktuell gültige. Diese Arbeit bezieht sich ausschließlich auf diese Spezifikation. Während der<br />

Entstehung dieser Arbeit wurde bereits an der Version 2.0 der EJB-Spezifikation gearbeitet,<br />

die zahlreiche Neuerungen beinhaltet (vergl. [DeMichiel et al. 00]). Da diese sich noch in der<br />

Entwicklung befindet und es daher noch keine vollständigen Implementierungen in Form<br />

von EJB-Containern gibt, wird sie nicht weiter behandelt. Selbst nach erscheinen der EJB-<br />

Spezifikation 2.0 wird es eine gewisse Zeit dauern, bis die neue Spezifikation von den EJB-<br />

Serverherstellern implementiert wird.<br />

1.1 Ziel der Arbeit<br />

Das von Sun Microsystems Inc. [Sun ] eingeführte Enterprise JavaBeans Komponentenmodell<br />

verspricht die Portierbarkeit von Enterprise JavaBeans Komponenten (kurz EJB-<br />

Komponenten). Mit anderen Worten bedeutet dies, daß alle EJB-Komponenten in EJB-Servern<br />

verschiedener Hersteller lauffähig sind, die entsprechend der EJB-Spezifikation [Matena,<br />

Hapner 99] implementiert werden. Die Programm-Logik in den EJB-Komponenten wird<br />

bei der Portierung nicht modifiziert.<br />

Ziel dieser Arbeit ist es, diese Portierbarkeit von EJB-Komponenten auf unterschiedliche<br />

EJB-Server anhand eines konkreten Beispiels zu überprüfen. Dabei wird eine Beispielanwendung<br />

mit Hilfe von EJB-Komponenten realisiert und anschließend in drei ausgewählten<br />

verschiedenen EJB-Servern installiert. Bei dem letzten Schritt wird geprüft, inwieweit die<br />

Portabilität von EJB-Komponenten gewährleistet ist.<br />

1.2 Gliederung der Arbeit<br />

Diese Arbeit befaßt sich mit der Portabilität von Enterprise JavaBeans Komponenten. Die<br />

Arbeit ist dabei so aufgebaut, daß zunächst die für den Kontext notwendigen Begriffe – Portabilität,<br />

Komponenten und Komponentenmodelle, Enterprise JavaBeans Komponentenmodell,<br />

Application-Server – in einzelnen Kapiteln eingeführt werden.<br />

Dabei wird in Kapitel 2 der Begriff der Portabilität näher erläutert und in Bezug zur Programmiersprache<br />

Java gesetzt.<br />

In Kapitel 3 werden nach der Einführung des Komponentenbegriffes drei Komponentenmodelle<br />

(JavaBeans, Enterprise JavaBeans und COM) kurz vorgestellt und das Enterprise<br />

JavaBeans und das COM/DCOM Komponentenmodell miteinander verglichen.<br />

Anschließend wird in Kapitel 4 das Enterprise JavaBeans Komponentenmodell ausführlich<br />

behandelt, einschließlich den in der EJB-Spezifikation eingeführten Rollen.<br />

Zu Beginn des Kapitels 5 wird die Evolution von Anwendungssystem-Architekturen dargestellt.<br />

Anschließend werden die von Application-Servern generell zur Verfügung gestellten


KAPITEL 1. EINLEITUNG 3<br />

Dienste aufgeführt.<br />

In Kapitel 6 wird eine Beispielanwendung basierend auf Enterprise JavaBeans Komponenten<br />

vorgestellt. In einem weiteren Schritt wird die in der EJB-Spezifikation aufgeführte Portabilität<br />

von EJB-Komponenten überprüft, in dem die Beispielanwendung auf drei verschiedenen<br />

EJB-Servern installiert wird.<br />

Kapitel 7 widmet sich der Abbildung eines Objekt-Modells auf ein EJB-Modell und beschreibt<br />

die auftretenden Abbildungsprobleme sowie zwei unterschiedliche Lösungsansätze.<br />

In Kapitel 8 wird zum Abschluß eine Zusammenfassung sowie ein Ausblick dieser Arbeit<br />

gegeben.


Kapitel 2<br />

Portabilität<br />

Im folgenden Kapitel wird der Begriff der Portabilität genauer untersucht, um ein besseres<br />

Verständnis für portable Enterprise JavaBeans Komponenten (Kapitel 3 und Kapitel 4) zu bekommen.<br />

Nach der Definition der Portabilität werden in Abschnitt 2.1 die wichtigsten Eigenschaften<br />

der Programmiersprache Java erläutert, wobei der Schwerpunkt auf der Plattformunabhängigkeit<br />

von Java liegt. In Abschnitt 2.2 werden die Eigenschaften portabler Software näher<br />

beschrieben.<br />

Die sich aus der Portabilität ergebenden Vor- und Nachteile werden in Abschnitt 2.3 vorgestellt.<br />

Abschnitt 2.4 widmet sich der Portabilität von Software aus marktwirtschaftlicher<br />

Sicht.<br />

Portabilität gewährleistet die Lauffähigkeit von Anwendungssoftware auf unterschiedlichen<br />

Systemen (Hardware/Betriebssystem/-umgebung) (vergl. [Rechenberg, Pomberger 97]).<br />

In der heutigen Zeit existieren eine Vielzahl von Hardware- und Software-Plattformen. Für<br />

jede einzelne Hardware-Software bzw. Hardware-Betriebssystem Kombination müssen Anwendungen<br />

entwickelt werden, was einen erheblichen Kosten- und Zeitaufwand sowohl<br />

bei der Entwicklung als auch bei der Wartung bedeutet. Das Hauptproblem ist hierbei, daß<br />

die selbe Anwendung für die jeweilige Hardware-Betriebssystem Kombination umprogrammiert<br />

werden muß und manche Programmteile sogar eine Neuprogrammierung erfordern.<br />

Dieser Vorgang ist sehr fehleranfällig, erfordert einen erheblichen Verwaltungsaufwand und<br />

verursacht erhebliche Kosten.<br />

Dieser Umstand kann mit Hilfe der Portabilität gemindert werden, denn durch Einsatz der<br />

Portabilität wird die Software nur einmal entwickelt. Folglich muß auch nur eine Anwendung<br />

gewartet werden.<br />

Daraus ergeben sich sowohl Vor- als auch Nachteile, die in Abschnitt 2.3 näher erläutert werden.<br />

4


KAPITEL 2. PORTABILITÄT 5<br />

2.1 Die Programmiersprache Java<br />

Java wurde erst 1991 von [Sun ] entwickelt und ist daher eine noch sehr junge Programmiersprache.<br />

Das erste Java Development Kit (JDK) war Anfang 1995 verfügbar. Trotz des jungen<br />

Alters hat Java eine beachtliche Verbreitung gefunden. Der eigentliche Durchbruch von Java<br />

gelang durch die sog. Applets. Dies sind graphische Java Anwendungen, die innerhalb eines<br />

Web-Browsers laufen. Bis zu der Einführung der Applets waren die HTML-Seiten (engl. Hypertext<br />

Markup Language) statische, mit Bildern angereicherte Textdokumente. Mit Hilfe der<br />

Applets konnten die HTML-Seiten nun mit dynamischen und bunten Grafik-Komponenten<br />

verschönert werden oder aber ganze Java-Anwendungen in HTML-Seiten integriert werden.<br />

Von diesem Zeitpunkt an war der Durchbruch von Java nicht mehr aufzuhalten.<br />

Java hat aber über die Applets hinaus noch weitere Eigenschaften (vergl. [Denninger, Peters<br />

00]), dazu zählen z.B.:<br />

• Objektorientierung<br />

• Dynamik<br />

• Stabilität<br />

• Sicherheit<br />

• Freie Verfügbarkeit von Java<br />

• Plattformunabhängigkeit<br />

Da Java eine objektorientierte Programmiersprache ist, bietet sie den Entwicklern die Vorteile<br />

objektorientierter Techniken.<br />

Die objektorientierten Eigenschaften von Java bilden auch die Basis für die komponentenorientierte<br />

Softwareentwicklung. In dieser Arbeit wird in Kapitel 3 ein kurzer Einblick in die komponentenorientierte<br />

Softwareentwicklung gegeben. Näheres zu diesem Thema kann z.B. in<br />

[Griffel 98] nachgelesen werden.<br />

Ein weiterer Vorteil von Java ist die Fähigkeit, Programmteile dynamisch (also zur Laufzeit)<br />

entweder vom lokalen Dateisystem oder über das Netz in den Adreßraum eines Prozesses<br />

zu laden und aus diesen zur Laufzeit Objekte zu erzeugen (vergl. [Denninger, Peters 00]).<br />

Java Programme sind im Vergleich zu Programmen der Programmiersprache C oder C++<br />

wesentlich stabiler. Dieses wird durch zahlreiche Mechanismen erreicht. Einer dieser Mechanismen<br />

ist das Fehlen von Pointern (Zeiger auf Variablen und Funktionen). In [Denninger,<br />

Peters 00] wird als ein Grund für die Stabilität von Java die Interpreter-Eigenschaft genannt.<br />

Dadurch führen Laufzeitfehler (z.B. Zugriff auf ungültige Objektreferenzen) nicht zu unkontrollierten<br />

Systemabstürzen. Die Laufzeitumgebung kann in solchen Fällen das Programm<br />

kontrolliert beenden.<br />

Bei der Entwicklung von Java wurde auch auf Sicherheitsaspekte geachtet. Dazu zählen<br />

z.B. das Fehlen von Zeigern, wodurch ein direkter Zugriff auf Speicherbereiche über Zeiger


KAPITEL 2. PORTABILITÄT 6<br />

verhindert wird. Ein weiterer Sicherheitsaspekt wird von Java durch das sog. sandbox-Prinzip<br />

bei der Verwendung von JavaApplets angeboten.<br />

Mit Hilfe des JavaSecurityManagers lassen sich kritische Operationen von Objekten (z.B. das<br />

Lesen und Schreiben von Dateien, das Öffnen von Netzwerkverbindungen etc.) steuern und<br />

bei Bedarf verbieten.<br />

Einer der Hauptgründe für die schnelle Verbreitung von Java ist, daß Java von Anfang an<br />

frei verfügbar war und so zahlreiche Entwickler sofort anfangen konnten zu entwickeln. Im<br />

Gegensatz dazu mußte man für vergleichbare Programmiersprachen eine kostenpflichtige<br />

Lizenz erwerben.<br />

Obwohl das Prinzip der Plattformunabhängigkeit von Software schon seit längerem exitiert,<br />

hat die Entwicklung portabler Software und das Prinzip der virtuellen Maschine erst<br />

mit der Einführung der Programmiersprache Java einen starken Zuwachs erfahren.<br />

Java setzt das Prinzip der virtuellen Maschine ein, um die hohe Portabilität des Programmcodes<br />

zu erreichen. In Java wird diese virtuelle Maschine als Java Virtual Machine (JVM)<br />

bezeichnet. Sie bildet die Schnittstelle zwischen dem übersetzten Java Binärcode und dem<br />

Mikroprozessor, der die Aktionen ausführt. Dieser sog. Java ByteCode is auf jeder realen Maschine<br />

ausführbar, für die eine Java Virtual Machine existiert.<br />

Das Konzept der Java Virtual Machine wird z.B. in [Ernst, Schneider 00] ausführlich behandelt.<br />

Wie in [Blair 01] beschrieben wird, bietet Java mehrere Ebenen der Portabilität, wobei jede<br />

Portabilitätsebene durch eine Spezifikation beschrieben wird:<br />

Source-Code:<br />

Java-Source-code Portabilität bedeutet, daß ein Java-Quellcode immer das selbe Ergebnis<br />

liefert, unabhängig von der eingesetzten CPU, des verwendeten Betriebssystems,<br />

der verwendeten Laufzeitumgebung oder des verwendeten Compilers.<br />

CPU:<br />

Ein übersetztes Java-Programm wird auf Computern mit unterschiedlichen CPUs identisch<br />

ausgeführt. Diese CPU-Portabilität wird von der Java Virtual Machine durch die<br />

Verwendung eines virtual instruction sets erreicht, in das der Java-Quellcode übersetzt<br />

wird. Dadurch wird das Verhalten des übersetzten Codes von der eingesetzten CPU<br />

isoliert.<br />

OS:<br />

Betriebssystemportabilität erlaubt es einem Programmierer, auf einheitliche Weise auf<br />

systemspezifische Dienste zurückzugreifen. Java bietet Betriebssystemportabilität durch<br />

Einsatz eines virtuellen Betriebssystems, welches den Entwicklern eine einheitliche Sicht<br />

auf systemspezifische Dienste gibt.<br />

J2EE Applikation:<br />

Hierbei sind Entwickler in der Lage, Client-Server Komponenten und Anwendungen


KAPITEL 2. PORTABILITÄT 7<br />

zu entwickeln, die sich unabhängig des eingesetzten Servers und Herstellers identisch<br />

verhalten und identisch installiert werden.<br />

2.2 Portabilität von Software<br />

Für den Begriff der portablen Software kann es mehrere Umsetzungen geben. Zum einen<br />

kann damit die Quellcodeportabilität gemeint sein. Unter Quellcodeportabilität versteht man<br />

die Tatsache, daß der Quellcode eines Programmes auf unterschiedlichen Betriebssystem-<br />

Plattformen ohne Modifikation übersetzt werden kann. Der aus diesem Schritt resultierende<br />

ausführbare Maschinencode ist nur auf dieser speziellen Betriebssystem-Hardware Kombination<br />

lauffähig.<br />

Voraussetzung für die Quellcodeportabilität ist jedoch das Vorhandensein der benötigten<br />

Bibliotheken auf allen Plattformen. Auch ist vor der Ausführung des Programms ein einmaliger<br />

Übersetzungsvorgang nötig.<br />

Demgegenüber steht die Binärcodeportabilität, die z.B. von Java angeboten wird. Hierbei wird<br />

der Quellcode eines Programms einmal in den sog. Java Byte-Code (Binärcode) übersetzt. Dieser<br />

ist dann auf jeder entsprechenden Java Virtual Machine ohne erneute Übersetzung lauffähig.<br />

Es spielt dabei keine Rolle, auf welcher Betriebssystem-Umgebung die Java Virtual<br />

Machine läuft. Jede neue Version der Programmiersprache Java ist in der Lage, den Byte-<br />

Code einer älteren Java-Version auszuführen. Es ist also eine sog. Abwärtskompatibilität in<br />

den einzelnen Java-Version vorhanden.<br />

2.3 Vor- und Nachteile der Portabilität<br />

Portable Software besitzt sowohl Vor- als auch Nachteile gegenüber nicht-portabler Software.<br />

Zu den Vorteilen der portablen Software gegenüber nicht-portabler Software zählen:<br />

• Einfachere Migration zu neuen Versionen und zu neuen Umgebungen<br />

• Stärkere Neuentwicklung von Anwendungen statt Neuimplementierung bereits vorhandener<br />

Anwendungen<br />

• Geringere Entwicklungs- und Verwaltungskosten<br />

• Einheitliche Anwendungen auf unterschiedlichen Hardware-/Softwareumgebungen.<br />

Es ist anhand der hier aufgeführten Vorteile schon ersichtlich auf welche Bereiche sich die<br />

Vorteile portabler Software erstrecken: Entwicklung, Verwaltung, Vermarktung.<br />

Portable Software hat jedoch auch ein paar Nachteile, die erwähnt werden müssen. Ein<br />

Nachteil von portabler Software ist, daß nur sehr bedingter Zugriff auf hardwarenahe Funktionen<br />

möglich ist. Durch die Verwendung hardwarenaher Funktionen bindet man sich an<br />

eine bestimmte Hardware und folglich ist eine Portabilität des Anwendungsprogrammes


KAPITEL 2. PORTABILITÄT 8<br />

eingeschränkt.<br />

Einer der größten Nachteile ist, daß portable Software in der Regel eine geringere Ausführungsgeschwindigkeit<br />

besitzt. Eine Ursache hierfür ist die eingeschränkte Möglichkeit,<br />

hardwarenahe Funktionen zu verwenden. Allerdings wurde auf dem Gebiet der Ausführungsgeschwindigkeit<br />

intensiv geforscht, so daß zahlreiche Verbesserungen erzielt worden<br />

sind. Als Beispiele lassen sich hier erwähnen:<br />

• JIT-Compiler (Just-In-Time Compiler)<br />

• Sun’s HOT-Spot Technologie<br />

Ein Ursache für die geringere Ausführungsgeschwindigkeit ist, daß keine hardwarenahen Implementierungen<br />

verwendet werden können, da die Software sonst nicht mehr portabel wäre.<br />

Die Java Virtual Machine z.B. abstrahiert von der tatsächlich vorhandenen Hardware. Durch<br />

diesen Schritt kann die hohe Portabilität des Java ByteCodes gewonnen werden, aber zum<br />

Preis von geringerer Ausführungsgeschwindigkeit.<br />

2.4 Marktwirtschaftliche Gesichtspunkte der Portabilität<br />

Für ein Unternehmen sprechen einige wirtschaftliche Gründe für die Entwicklung und den<br />

Vertrieb von portabler Software.<br />

Zum einen werden Wartungskosten der Software gesenkt, da nur eine Anwendung gewartet<br />

werden muß. Bei der Entwicklung nicht-portabler Software hingegen muß die selbe Anwendung<br />

für jede Plattform separat entwickelt und gewartet werden, was einen erheblichen<br />

Kosten- und Wartungsaufwand bedeuten kann.<br />

Zum anderen wird die Erweiterung portabler Software vereinfacht. Die Erweiterung von<br />

nicht-portablen Anwendungen ist hingegen wesentlich komplexer.


Kapitel 3<br />

Komponentenmodelle<br />

Im Mittelpunkt dieses Kapitels stehen die Komponentenmodelle. Um ein besseres Verständnis<br />

für Komponenten und Komponentenmodelle zu bekommen, wird in Abschnitt 3.1 eine kurze<br />

Einführung in verteilte Anwendungen gegeben. Dabei wird kurz auf die Merkmale von verteilten<br />

Anwendungen eingegangen. Anschließend wird in Abschnitt 3.2 der Komponenten-<br />

Begriff eingeführt und erläutert. In Abschnitt 3.3 wird kurz darauf eingegangen, für welche<br />

Problemklassen sich Komponentenmodelle eignen. Es folgen dann eine kurze Vorstellung<br />

des JavaBeans Komponentenmodells (Abschnitt 3.4), Enterprise JavaBeans Komponentenmodells<br />

(Abschnitt 3.5) und des COM Komponentenmodells (Abschnitt 3.6). Zum Abschluß<br />

dieses Kapitels werden in Abschnitt 3.7 das Enterprise JavaBeans und das COM/DCOM<br />

Komponentenmodell kurz miteinander verglichen.<br />

Es wird in dieser Arbeit nicht auf das von der OMG eingeführte CORBA Komponentenmodell<br />

eingegangen. Ausführliche Information über das CORBA Komponentenmodell kann<br />

z.B. in [OMG ] nachgelesen werden.<br />

3.1 Verteilte Anwendungen<br />

Wegen der gesunkenen Kosten für Rechner und Netzwerktechnologie und der gewachsenen<br />

Bedeutung von Kooperation unter geographisch verteilten Benutzern sowie der gemeinsamen<br />

Benutzung von Information, werden in letzter Zeit immer mehr Arbeitsplätze mit Rechnern<br />

ausgestattet und diese lokal oder auch firmenübergreifend miteinander verbunden.<br />

Unter verteilten Anwendungen versteht man Dienste, die auf solchen vernetzten Rechnern<br />

verteilt erbracht werden. Die Verteilung betrifft neben den Daten (z.B. verteilte Dateisysteme)<br />

auch die Kontrolle und die Verarbeitung. Dadurch kann man eine höhere Zuverlässigkeit<br />

und Leistung sowie eine erhöhte Fehlertoleranz erhalten. Weiterhin zeichnen sich viele<br />

verteilte Anwendungen dadurch aus, dass sie von mehreren Benutzern gleichzeitig benutzt<br />

werden können und auch deren Zusammenarbeit unterstützen.<br />

Bei der Erstellung von verteilten Anwendungen geht es zuerst um die Unterteilung von Programmpaketen<br />

in verschiedene Dienste, die von unterschiedlichen Rechnern an verschiedenen<br />

Orten erbracht werden können. Genau diese Dienste werden von den Komponenten<br />

9


KAPITEL 3. KOMPONENTENMODELLE 10<br />

erbracht.<br />

Durch den Einsatz verteilter Anwendungen erhofft man sich folgende Vorteile (vergl. [CetusLinks<br />

]):<br />

• Altsysteme können weiterverwendet werden<br />

• Entwickler haben die Möglichkeit, Teilkomponenten einer Anwendung auf Computer<br />

zu verteilen, die der zu erfüllenden Aufgabe am Besten gewachsen sind. Im Falle einer<br />

Verschiebung einer Komponente auf neue Hardware bleibt die übrige Anwendung<br />

hiervon unberührt.<br />

• Verteilte Objekte bzw. Komponenten erscheinen für den Benutzer wie lokale Objekte.<br />

Der Benutzer bemerkt nicht, daß die Komponente sich auf einem anderen Rechner<br />

befindet.<br />

Eine der wichtigsten Bestandteile verteilter Anwendungen sind die Komponenten. Die Definition<br />

einer Komponente sowie eine Beschreibung werden nun in dem folgenden Abschnitt<br />

gegeben.<br />

3.2 Komponenten<br />

Der Begriff der Komponente wird in der EDV in unterschiedlichen Bereichen verwendet.<br />

Trotzdem gibt es keine allgemeingültige Definition des Komponentenbegriffs. Beispiele für<br />

die verschiedenen Definitionen einer Komponente können z.B. in [Szyperski 97] oder [Frank<br />

] nachgelesen werden.<br />

In dieser Arbeit wird eine Definition der Softwarekomponente verwendet, wie sie in [Griffel<br />

98] definiert wird:<br />

„ Eine Komponente ist ein Stück Software, das klein genug ist, um es in einem<br />

Stück erzeugen und pflegen zu können, groß genug ist, um eine sinnvoll einsetzbare<br />

Funktionalität zu bieten und eine individuelle Unterstützung zu rechtfertigen,<br />

sowie mit standardisierten Schnittstellen ausgestattet ist, um mit anderen<br />

Komponenten zusammenzuarbeiten.“<br />

Die objektorientierte Modellierung führt häufig zu einer großen Anzahl an Klassen, Objekten<br />

sowie zahlreichen Beziehungen. Da es sich in diesem Fall um „kleine“ Elemente handelt,<br />

ist es oft schwierig, bestimmte Wiederverwendungs-Einheiten zu finden. Die Zusammenfassung<br />

von eng zusammengehörigen Klassen zu größeren Wiederverwendungs-Einheiten<br />

werden Komponenten genannt (vergl. [Henrich 01]).<br />

Eine Komponente besitzt folgende in der Literatur am häufigsten beschriebenen Eigenschaften<br />

(vergl. [Griffel 98], [Szyperski 97], [Frank ]):<br />

• Unabhängigkeit<br />

• Abgeschlossenheit


KAPITEL 3. KOMPONENTENMODELLE 11<br />

• Offenheit<br />

Komponenten sollen unabhängig voneinander und auch von anderen Anwendungen sein.<br />

Mit Abgeschlossenheit ist gemeint, daß Komponenten eine in sich geschlossene und vollständige<br />

Funktionalität bieten sollen.<br />

Der Begriff der Offenheit meint, daß Komponenten offen mit anderen Komponenten in beliebigen<br />

Systemumgebungen (z.B. Netzwerken) zusammenwirken können.<br />

Das Zusammenwirken von Komponenten und das Anbieten von Diensten geschieht bei<br />

Komponenten ausschließlich über ihre Schnittstellen.<br />

In [Henrich 01] wird bei der Vorstellung der Component-Based Development (CBD), also der<br />

komponentenbasierten Software-Entwicklung, eine sog. Legostein-Metapher aufgeführt. Diese<br />

Metapher beschreibt eine Komponente als Legostein. Durch das Zusammenstecken von<br />

einfachen Legosteinen entstehen komplexe Modelle. Auf die Komponenten übertragen bedeutet<br />

dies, daß durch das Zusammenstecken von vorgefertigten Komponenten komplexe<br />

Anwendungen erstellt werden können. Die vorgefertigten Komponenten sind i.A. schon<br />

ausgiebig getestet. Beim Zusammenstecken muß nur beachtet werden, daß die Schnittstellen<br />

zueinander passen. Wie die vorgefertigte Komponente implementiert ist - die technische<br />

Implementierung der Komponente also - sollte für den Benutzer nicht sichtbar sein. Das<br />

Kernproblem bei der komponentenorientierten Software-Entwicklung ist es, die richtigen<br />

Komponenten zu finden.<br />

Die durch den Einsatz von Komponenten erhofften Vorteile sind vielfältig. So ist einer der<br />

wichtigsten Vorteile die Wiederverwendbarkeit von Komponenten. Einmal erstellte Komponenten<br />

sollen in verschiedenen Anwendungsszenarien wiederverwendet werden können,<br />

ohne die Komponenten modifizieren zu müssen.<br />

Weitere durch den Einsatz von Komponenten erhoffte Vorteile sind zum Beispiel:<br />

• Verkürzung der Entwicklungszeit bei der Anwendungserstellung<br />

• Bessere Wartbarkeit der Komponenten<br />

• Steigerung der Produktivität der Mitarbeiter<br />

• Eingrenzung der Auswirkung von Änderungen (Folge: leichtere und billigere Wartung)<br />

• Bessere Flexibilität, da eine bestehende Komponente durch eine neue ersetzt werden<br />

kann, die sowohl alte als auch neue Anforderungen erfüllen kann<br />

Nachdem in diesem Abschnitt der Begriff der Komponente erläutert wurde, wird nun der<br />

Begriff des Komponentenmodells erläutert.<br />

Wie in [Henrich 01] beschrieben wird legt ein Komponentenmodell die von den Komponenten<br />

zu erfüllenden Eigenschaften fest.


KAPITEL 3. KOMPONENTENMODELLE 12<br />

Laut [Segev, Bichler 99] beschreibt ein Komponentenmodell eine Menge von Richtlinien, die<br />

das Aussehen der Komponenten-Schnittstellen festlegen. Dazu soll ein Komponentenmodell<br />

folgende Möglichkeiten bieten:<br />

• Properties<br />

• Introspection<br />

• Customization<br />

• Persistence<br />

• Packaging<br />

Die aufgeführten Punkte sollen der Austauschbarkeit von Komponenten sowie der Förderung<br />

der Wiederverwendung der Komponenten dienen.<br />

Viele der hier beschriebenen Eigenschaften von Komponentenmodellen werden durch das<br />

Enterprise JavaBeans Komponentenmodell erfüllt.<br />

3.3 Problemklassen<br />

In der Softwareentwicklungspraxis gibt es einige zentrale Probleme, die größtenteils auch<br />

nicht durch den Einsatz der objektorientierten Programmierung zu lösen sind. Zu den zentralen<br />

Problemen zählen unter anderem:<br />

• lange Entwicklungszeit der Software<br />

• unzureichende Qualität und Flexibilität der Software<br />

• kaum Wiederverwendbarkeit von Software<br />

Diese Probleme sollen durch den Einsatz von komponentenbasierter Softwareentwicklung<br />

gelöst werden.<br />

Komponentenmodelle eignen sich für den Einsatz in Umgebungen, in denen die meisten<br />

eingesetzten Applikationen ähnliche Strukturen aufweisen. Es lassen sich unter anderem<br />

folgende Strukturen erkennen:<br />

• Es existiert eine Datenbank, die Geschäfts-Entitäten enthält<br />

• Es existieren Prozesse, die diese Geschäfts-Entitäten verändern<br />

• Die Prozesse sind in der Regel transaktional gesichert<br />

• Die Applikationen besitzen in der Regel eine graphische Oberfläche<br />

• Die technischen und funktionalen Aspekte der Applikationen lassen sich trennen


KAPITEL 3. KOMPONENTENMODELLE 13<br />

• Teile der Applikationen sind in der Regel auf mehreren Rechnern verteilt, so daß ein<br />

großer Teil der Applikation für die Kommunikation über Rechnergrenzen hinweg zuständig<br />

ist<br />

Besonders der letzte Punkt, die Implementierung technischer Aspekte, ist ein Bereich, der<br />

die Applikationen kennzeichnet. Durch den Einsatz von Komponentenmodellen können<br />

sich die Entwickler auf die fachlichen Dinge konzentrieren. Die meisten technischen Aspekte<br />

werden durch das Komponentenmodell abgedeckt.<br />

3.4 JavaBeans<br />

Das JavaBeans-Komponentenmodell wurde von [Sun ] entwickelt und stellt ein clientseitiges<br />

Komponentenmodell dar, daß auf Java basiert. JavaBeans sind visuelle Komponenten.<br />

Bei JavaBeans Komponenten handelt es sich um sog. intraprozeß Komponenten, die in einem<br />

Addressraum mit dem Aufrufer „leben“. Typischerweise werden diese bei der graphischen<br />

Benutzerschnittstelle (GUI, Graphical User Interface) als Knöpfe, Tabellen o.ä. eingesetzt<br />

(vergl. [Sun ]).<br />

3.5 Enterprise JavaBeans<br />

Das EJB Komponentenmodell wurde von SUN [Sun ] entwickelt und repräsentiert wie in<br />

[Monson-Haefel 01] und [Monson-Haefel 00] dargestellt die Konvergenz von zwei Technologien:<br />

• den traditionellen Transaktionsmonitoren (kurz: TP-Monitore)<br />

• und den verteilten Komponenten-Systemen.<br />

Bei den TP-Monitoren handelt es sich um zuverlässige und skalierbare Anwendungssysteme.<br />

Zu den bekanntesten Vertretern der TP-Monitore zählen u.a.<br />

• CICS (siehe [IBM a]),<br />

• TUXEDO (siehe [BEA a])<br />

• ENCINA (siehe [IBM b])<br />

Die Aufgabe der TP-Monitore umfaßt die Kontrolle von z.B. Transaktionen, Sicherheit, Ressourcenmanagement,<br />

Lastausgleich und Fehlertoleranz. Eine genauere Beschreibung dieser<br />

Aufgaben wird in Kapitel 5 im Rahmen der Beschreibung von durch Application-Servern<br />

angebotenen Diensten gegeben.<br />

Der Zusammenhang von TP-Monitoren und Application-Servern besteht darin, daß mit<br />

den TP-Monitoren die drei-Schichten-Architektur eingeführt wurde, die für die Application-<br />

Server die Basis darstellt. Die durch die TP-Monitore überwachten Anwendungen wurden


KAPITEL 3. KOMPONENTENMODELLE 14<br />

hauptsächlich in einer prozeduralen Programmiersprache wie z.B. COBOL oder PL/1 geschrieben.<br />

Die verteilten Komponenten-Systeme stellen gegenwärtig den modernsten Ansatz der drei-<br />

Schichten-Architektur dar. Hierbei werden Objekte oder Komponenten der mittleren Schicht<br />

(engl. middle tier) mit Hilfe von Stellvertreter Objekten (sog. proxies) verwendet. Die meist auf<br />

Clientseite vorhandenen proxies leiten die Anfragen an die verteilten Komponenten über<br />

das Netz weiter und auch umgekehrt.<br />

Zu den bekanntesten Vertretern der verteilten Komponentensysteme zählen Java RMI, COR-<br />

BA und DCOM. Der Vorteil von verteilten Komponenten gegenüber den von TP-Monitoren<br />

überwachten prozeduralen Anwendungen liegt in der höheren Wiederverwendbarkeit und<br />

der Flexibilität der Komponenten.<br />

Was den Verteilten Komponenten jedoch fehlt ist eine robuste Infrastruktur, wie sie von TP-<br />

Monitoren geboten wird (vergl. [Monson-Haefel 01], [Monson-Haefel 00]).<br />

Das EJB-Komponentenmodell stellt nun ein Produkt dieser beiden divergierenden Technologien<br />

dar. So finden sich in der EJB-Architektur die typischen Eigenschaften der TP-Monitore<br />

wieder, wie z.B.<br />

• Transaktionsverwaltung,<br />

• Sicherheitsaspekte,<br />

• Nebenläufigkeit,<br />

• Persistenz,<br />

• Lastausgleich (engl. load balancing),<br />

• Fehlertoleranz (engl. failover).<br />

Auch finden sich in der EJB-Architektur die typischen Merkmale der verteilten Komponentensysteme<br />

wieder, wie z.B. die Komponenten.<br />

Die in der EJB-Architektur eingesetzten verteilten Komponenten sind die Enterprise JavaBeans,<br />

die vollständig in Java geschrieben werden.<br />

Enterprise JavaBeans werden zur Modellierung von Anwendungslogik eingesetzt. Mehrere<br />

Enterprise JavaBeans können zusammen zu einer Anwendung verknüpft und in einem EJB-<br />

Server installiert werden.<br />

Zum Zeitpunkt der Installation der Enterprise JavaBeans kann z.B. das transaktionale Verhalten,<br />

das Persistenzverhalten und das Sicherheitsverhalten der Enterprise JavaBeans mit<br />

Hilfe von deklarativen Attributen gesteuert werden.<br />

Zahlreiche Hersteller haben den EJB-Standard implementiert und in ihren Produkten integriert.<br />

Als Beispiel lassen sich folgende Hersteller bzw. deren Produkte nennen:<br />

• IBM Corporation, WebSphere Application-Server ([IBM b])


KAPITEL 3. KOMPONENTENMODELLE 15<br />

• BEA Systems, Bea WebLogic Application-Server ([BEA b])<br />

• Borland Corporation, Borland Application-Server ([Borland ])<br />

• Oracle, Oracle Application-Server ([Oracle ])<br />

• Persistence, PowerTierEJB for J2EE ([Persistence ])<br />

• Sybase, Sybase Enterprise Application-Server ([Sybase ])<br />

• SilverStream, SilverStream Application-Server ([Silverstream ])<br />

• SUN Microsystems, NetDynamics Application-Server ([Sun ])<br />

Es muß jedoch bemerkt werden, daß nicht jeder Hersteller den vollen EJB-Standard implementiert.<br />

Einige Hersteller bieten z.B. in ihren EJB-Servern keine Implementierung der<br />

Entity-Beans an. Eine tiefere Darstellung des EJB Komponentenmodells wird in Kapitel 4<br />

gegeben.<br />

3.6 COM<br />

Das Komponentenmodell COM (Component Object Model) wurde von Microsoft ([Microsoft<br />

]) für die Windows-Plattformen entwickelt. Es handelt sich hierbei um ein sog. Intraprozeß-Modell,<br />

das auch als lokales Komponentenmodell bezeichnet wird (vergl. [Lewis ]).<br />

DCOM (Distributed COM) erweitert das COM-Modell für verteilte Anwendungs-Software.<br />

Bei DCOM handelt es sich um ein sog. Interprozeß-Modell, das auch als verteiltes Komponentenmodell<br />

bezeichnet wird.<br />

In [Lewis ] wird COM als ein Rahmenwerk zum Erstellen und Verwenden von Komponenten<br />

beschrieben, die auf binärer Stufe wiederverwendet werden können. Die Wiederverwendung<br />

auf binärer Stufe bedeutet, daß einmal geschriebene COM-Komponenten nur in<br />

ihrer Binärform (kompilierte Form) eingesetzt und verwendet werden können. Wie in [Lewis<br />

] weiter beschrieben wird sind COM Komponenten weitestgehend sprachenunabhängig.<br />

Eine COM-Komponente kann mit verschiedenen auf der Windows-Plattform verfügbaren<br />

Programmiersprachen erstellt werden. Zu den Vertretern der COM-fähigen Programmiersprachen<br />

zählen z.B.<br />

• Microsoft Visual C++<br />

• Microsoft Visual Basic<br />

• Borland Delphi<br />

Einmal erstellte COM-Komponenten können in fast allen auf der Windows-Plattform verfügbaren<br />

Programmiersprachen verwendet werden.<br />

Durch den Einsatz von DCOM wird die rechnerübergreifende Kommunikation zwischen<br />

COM-Komponenten ermöglicht. Erst durch DCOM wird die sog. Ortstransparenz von COM-<br />

Komponenten erreicht. Erreicht wird dies durch Verwendung der Microsoft Windows-Registry,<br />

die die Rolle einer zentrale Konfigurationsdatei besitzt. In dieser Registry werden neben den


KAPITEL 3. KOMPONENTENMODELLE 16<br />

Namen der Komponenten die Orte bzw. Rechneradressen der entfernten Rechner gespeichert,<br />

auf denen die Komponenten installiert sind.<br />

Wie in Abschnitt 3.2 beschrieben, bieten alle Komponenten über ihre Schnittstellen Dienste<br />

an. So besitzen auch COM-Komponenten eine oder mehrere Schnittstellen, über die sie ihre<br />

Dienste anbieten.<br />

An dieser Stelle soll nicht näher auf das hier beschriebene Komponentenmodell eingegangen<br />

werden. Ausführlichere Information kann in den angegebenen Literaturverweisen nachgelesen<br />

werden.<br />

3.7 Vergleich der Komponentenmodelle<br />

Jedes der in den vorangegangenen Abschnitten vorgestellten Komponentenmodelle hat seine<br />

Vor- und Nachteile. Beim direkten Vergleich zwischen dem Sun EJB-Komponentenmodell<br />

und dem Microsoft COM/DCOM Komponentenmodell läßt sich dies erkennen. In reinen<br />

Windows-Netzwerken ist COM/DCOM die bessere Wahl, in reinen Java-Netzwerken der<br />

EJB-Ansatz.<br />

Für den EJB-Ansatz spricht, daß es sich um einen offenen Standard handelt sowie die Unterstützung<br />

durch eine große Anzahl von Partnern. Ein weiterer Vorteil für den EJB-Ansatz<br />

ist die Unterstützung von heterogenen Plattformen aufgrund der Portabilität von Java. Da<br />

das EJB-Komponentenmodell relativ jung ist, fehlen noch einige Entwicklungswerkzeuge,<br />

die sich jedoch in Entwicklung befinden.<br />

In Tabelle 3.1 werden das EJB- und das COM/DCOM-Komponentenmodell gegenübergestellt<br />

und anhand einiger Merkmale miteinander verglichen.<br />

In dem nun folgenden Kapitel 4 wird das Enterprise JavaBeans Komponentenmodell ausführlich<br />

beschrieben.


KAPITEL 3. KOMPONENTENMODELLE 17<br />

Komponentenmodell SUN Microsystems EJB Microsoft COM/DCOM<br />

Offener bedingt nein<br />

Standard<br />

Heterogene ja bedingt<br />

Plattformen<br />

Sprachunab- nein bedingt<br />

hängigkeit<br />

(C++,VB,Delphi)<br />

Vorteile offener Standard; viele Komponenten<br />

große Zahl von Partnern verfügbar<br />

Nachteile relativ neu und Windowsbasiert<br />

wenige Werkzeuge<br />

Tabelle 3.1: Komponentenmodelle im Vergleich


Kapitel 4<br />

Enterprise JavaBeans<br />

Komponentenmodell<br />

In diesem Kapitel wird das Enterprise JavaBeans Komponentenmodell ausführlich beschrieben.<br />

Es werden in Abschnitt 4.1 zunächst die in der EJB-Spezifikation [Matena, Hapner 99]<br />

eingeführten Bean-Arten beschrieben. In Abschnitt 4.2 wird daraufhin beschrieben, welche<br />

Persistenzarten bei den Entity-Beans möglich sind. In Abschnitt 4.3 wird anhand eines einfachen<br />

Beispiels der allgemeine Aufbau von Enterprise JavaBeans Komponenten gezeigt. In<br />

Abschnitt 4.4 werden die den Enterprise JavaBeans angebotenen Dienste aufgeführt. Dem<br />

EJB-Container widmet sich der Abschnitt 4.5. Die mit der EJB-Spezifikation eingeführten Rollen<br />

mit den dazugehörigen Verantwortlichkeiten werden in Abschnitt 4.7 vorgestellt.<br />

Der für die Portabilität der Enterprise JavaBeans notwendige Deployment-Deskriptor wird<br />

in Abschnitt 4.8 behandelt. Abschnitt 4.9 befaßt sich mit der Portabilität von Enterprise<br />

JavaBeans-Komponenten.<br />

Abgeschlossen wird dieses Kapitel durch Abschnitt 4.10, in dem die Java 2 Plattform, Enterprise<br />

Edition (J2EE) vorgestellt wird und ein Zusammenhang zum EJB-Standard hergestellt<br />

wird.<br />

4.1 Bean-Arten<br />

In der EJB-Spezifikation [Matena, Hapner 99] werden zwei grundsätzliche Enterprise Bean-<br />

Arten vorgestellt:<br />

• Session-Beans<br />

• Entity-Beans<br />

Kurz ausgedrückt handelt es sich bei den Session-Beans um nicht-persistente, transaktionale,<br />

serverseitige Java Komponenten.<br />

In [Denninger, Peters 00] werden Session-Beans als Verlängerung des Clients auf dem Server<br />

angesehen und werden hauptsächlich zur Modellierung von Abläufen oder Vorgängen<br />

18


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 19<br />

eingesetzt. Eine Session-Bean kann z.B. mehrere verschiedene Entity-Beans verwenden bzw.<br />

deren Methoden aufrufen, um eine spezifische Aufgabe zu erledigen. Die Hauptaufgabe der<br />

Session-Beans ist also die Koordination von anderen Session- und Entity-Beans zur Durchführung<br />

einer Gesamtaufgabe. Ein weiteres Merkmal einer Session-Bean ist, daß sie keinen<br />

persistenten Zustand besitzt, der z.B. in einer relationalen Datenbank gespeichert wird. Eine<br />

Session-Bean kann aber dennoch bestimmte Daten in einer Datenbank modifizieren, neue<br />

Daten einfügen oder sogar bestehende Daten löschen.<br />

Für Session-Beans existiert noch eine weitere Unterteilung:<br />

• zustandslos (stateless)<br />

• zustandsbehaftet (stateful).<br />

In [Denninger, Peters 00] werden zustandslose Session-Beans so beschrieben, daß zwischen<br />

den Methodenaufrufen der zustandslosen Session-Bean keine Daten über den Zustand der<br />

Bean gespeichert werden. Der Bean stehen für den Aufruf einer Methode nur die übergebenen<br />

Parameter als Daten zur Verfügung. Nach erfolgtem Aufruf einer Methode kann die<br />

Bean einem anderen Client zugeordnet werden. Die Identität der zustandslosen Session-<br />

Beans des gleichen Typs ist zur Laufzeit immer gleich, wodurch eine Bean mehreren Clients<br />

zu Verfügung steht. Folglich hat ein Client nur für die Dauer eines Methodenaufrufes exklusiven<br />

Zugriff auf die zustandslose Session-Bean.<br />

Zustandsbehaftete Session-Beans hingegen besitzen einen Zustand. Auch werden zustandsbehaftete<br />

Session-Beans jeweils genau einem Client zugeordnet und stehen diesem solange<br />

exklusiv zur Verfügung, bis der Client die Bean nicht mehr benötigt oder der EJB-Server heruntergefahren<br />

wird. Die Identität von zustandsbehafteten Session-Beans des gleichen Typs<br />

ist zur Laufzeit verschieden.<br />

Die in [Matena, Hapner 99] aufgeführte zweite Ausprägung der Enterprise-Beans sind die<br />

Entity-Beans. Bei Entity-Beans handelt es sich um persistente, transaktionale, serverseitige<br />

Java Komponenten. Entity-Beans repräsentieren wichtige Geschäftsobjekte, wie z.B. Kunde,<br />

Ware, Bestellung, Konto usw. Mehrere Clients können eine Instanz eines bestimmten Typs<br />

gleichzeitig verwenden. Die Daten von Entity-Beans werden in einem dauerhaften Speicher<br />

wie z.B. einer relationalen Datenbank gespeichert. Jede Entity-Bean besitzt neben den persistent<br />

gespeicherten Daten noch ein bestimmtes Verhalten.<br />

Bei den Entity-Beans lässt sich eine weitere Unterteilung vornehmen, und zwar in beanmanaged<br />

persistence (BMP) Entity Bean und container-managed persistence (CMP) Entity Bean.<br />

Diese unterschiedlichen Persistenzarten werden in dem folgenden Abschnitt 4.2 näher beschrieben.<br />

In Tabelle 4.1 sind die Unterscheidungskriterien der beiden Ausprägungen der Enterprise-<br />

Beans nochmal tabellarisch aufgeführt.


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 20<br />

Merkmal Session-Bean Entity-Bean<br />

Aufgabe der Bean Repräsentiert einen serverseitigen Repräsentiert ein Geschäftsobjekt,<br />

Dienst, der Aufgaben<br />

dessen Daten sich in einem<br />

für einen Client ausführt<br />

dauerhaften Speicher befinden.<br />

Zugriff auf die Bean Eine Session-Bean ist für den Die Entity-Bean ist eine zentrale<br />

Client eine private Ressource. Ressource; die Bean-Instanz wird von<br />

mehreren Clients gleichzeitig benutzt,<br />

und ihre Daten stehen allen Clients<br />

zur Verfügung.<br />

Persistenz der Bean Nicht persistent; Persistent;<br />

wenn der verbundene Client Wenn die verbundenen Clients oder<br />

oder der Server terminiert werden, der Server terminiert werden,<br />

ist die Bean<br />

befindet sich der Zustand der<br />

nicht mehr verfügbar.<br />

Entity-Bean auf einem persistenten<br />

Speichermedium; die Bean kann so<br />

zu einem späteren Zeitpunkt<br />

wiederhergestellt werden.<br />

Tabelle 4.1: Unterscheidungskriterien zwischen Session- und Entity-Beans<br />

4.2 Persistenz von EJB-Komponenten<br />

In der EJB-Spezifikation [Matena, Hapner 99] werden zwei Persistenz-Arten für EJB-Komponenten<br />

dargelegt:<br />

• Container-managed persistence<br />

• Bean-managed persistence.<br />

Bei Container-managed persistence wird die Aufgabe der persistenten Speicherung der Entity-<br />

Beans vom EJB-Container übernommen. Dabei generiert der EJB-Container die für den Zugriff<br />

auf den Datenspeicher notwendigen SQL-Anweisungen. Bei dem Datenspeicher handelt<br />

es sich meistens um eine relationale Datenbank.<br />

Der EJB-Container stellt eine Laufzeitumgebung für die Enterprise JavaBeans bereit. Eine<br />

genauere Beschreibung des EJB-Containers folgt in Abschnitt 4.5.<br />

Bei der Bean-Managed persistence ist der Bean-Entwickler für die persistente Speicherung<br />

der Entity-Bean zuständig. Dies bewerkstelligt er in der Regel mit Hilfe der JDBC-API.


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 21<br />

4.3 Aufbau der EJB-Arten<br />

Ziel dieses Abschnittes ist es, anhand eines einfachen Programmes, dem HelloWorld-Programm,<br />

den Aufbau der EJBs zu verdeutlichen. Entity-Beans und Session-Beans bestehen<br />

immer aus drei Teilen:<br />

• Home-Interface<br />

• Remote-Interface<br />

• Entity- oder Session Bean Klasse.<br />

Für Entity-Beans existiert i.A. noch die primary key Klasse.<br />

Das Home-Interface dient zum Erstellen und Finden von EJBs. Es dient dabei lediglich als<br />

Schnittstelle zwischen dem Client und den EJBs. Clients können nur mit Hilfe des Home-<br />

Interfaces Session-Beans bzw. Entity-Beans erzeugen. Zu jeder EJB-Komponente existiert ein<br />

eigenes Home-Interface. In gewisser Hinsicht stellt das Home-Interface eine Variation des in<br />

[Gamma et al. 95] vorgestellten Fabrik-Entwurfsmusters (engl. factory-pattern) dar.<br />

Das Home-Interface stellt für den Zugriff auf EJBs folgende Methoden bereit:<br />

• create<br />

• find<br />

Die create-Methode liefert immer ein Remote-Interface Objekt der EJB-Komponente zurück.<br />

Mit Hilfe des Remote-Interfaces kann der Client die Geschäfts-Methoden der EJB-<br />

Komponente aufrufen. Ein einfaches Home-Interface einer Session-Bean stellt sich folgendermaßen<br />

dar:<br />

import java.io.Serializable;<br />

import java.rmi.RemoteException;<br />

import javax.ejb.CreateException;<br />

import javax.ejb.EJBHome;<br />

public interface HelloHome extends EJBHome<br />

{<br />

}<br />

Hello create() throws RemoteException, CreateException;<br />

Das Remote-Interface stellt alle in der EJB-Komponente vorhandenen Geschäfts-Methoden<br />

bereit, die von Clients verwendet werden dürfen. Die Tatsache, daß die Geschäfts-Methoden<br />

in zwei Klassen aufgeführt werden, stellt eine gewisse Redundanz dar, die aber von Sun beabsichtigt<br />

scheint. Die EJB-Spezifikation verbietet es z.B. nicht, die Signaturen der zu veröffentlichenden<br />

Geschäfts-Methoden in einem eigenen Interface zu schreiben. Dieses Interface<br />

kann vom Remote-Interface spezialisiert werden und von der EJB-Komponente implementiert<br />

werden. Dieser Ansatz erhöht die Wartbarkeit im Falle von Signaturänderungen.<br />

Ein einfaches Remote-Interface sieht folgendermaßen aus:


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 22<br />

import javax.ejb.EJBObject;<br />

import java.rmi.RemoteException;<br />

public interface Hello extends EJBObject<br />

{<br />

public String sayHello() throws RemoteException;<br />

}<br />

In diesem Fall handelt es sich um eine Session-Bean, die nur eine einzige Geschäfts-Methode<br />

besitzt: sayHello().<br />

Die Entity- oder Session-Bean Klasse beinhaltet die Geschäfts-Methoden.<br />

Neben diesen existieren in der Bean-Klasse noch folgende Methoden:<br />

• ejbActivate<br />

• ejbCreate<br />

• ejbLoad<br />

• ejbPassivate<br />

• ejbPostCreate<br />

• ejbRemove<br />

• ejbStore<br />

Diese Methoden spielen eine wichtige Rolle für die verschiedenen Bean-Zustände und erlauben<br />

je nach Persistenzart der Bean noch bestimmte Aktionen durchzuführen, vor oder<br />

nach einem Zustandswechsel.<br />

Tiefer soll hier nicht auf die Bedeutung der einzelnen Methoden eingegangen werden. Dies<br />

kann z.B. in [Monson-Haefel 00], [Roman 99] oder [Matena, Hapner 99] nachgelesen werden.<br />

Die zu den oben aufgeführten Home- und Remote-Interface gehörige Session-Bean Klasse<br />

stellt sich folgendermaßen dar:<br />

import java.rmi.RemoteException;<br />

import javax.ejb.SessionBean;<br />

import javax.ejb.SessionContext;<br />

public class HelloEJB implements SessionBean<br />

{<br />

public String sayHello()<br />

{<br />

return "Hello";<br />

}


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 23<br />

public HelloEJB() {}<br />

public void ejbCreate() {}<br />

public void ejbRemove() {}<br />

public void ejbActivate() {}<br />

public void ejbPassivate() {}<br />

public void setSessionContext(SessionContext sc) {}<br />

}<br />

Ein Client der Bean-Klasse führt seine Methodenaufrufe am Remote-Interface durch und<br />

nicht an der Bean-Klasse selbst. Die Bean befindet sich nur im EJB-Container. Mit Hilfe der<br />

Werkzeuge des EJB-Containers wird eine Klasse generiert, die das Remote-Interface implementiert<br />

und Aufrufe an das Bean-Objekt (HelloEJB) delegiert.<br />

4.4 Angebotene Dienste<br />

In diesem Abschnitt werden die von dem EJB-Standard angebotenen Dienste aufgeführt und<br />

kurz erläutert.<br />

In der EJB-Spezifikation werden den EJBs zahlreiche Standarddienste zur Verfügung gestellt.<br />

Diese Dienste lassen sich in fünf Kategorien unterteilen:<br />

• Lebenszyklus<br />

• Zustandsmanagement<br />

• Sicherheit<br />

• Transaktionen<br />

• Persistenz<br />

Der EJB-Container bietet Dienste für die Verwaltung des Lebenszyklus von Beans. Dazu zählen<br />

die Erzeugung, Aktivierung, Passivierung sowie Zerstörung der Bean.<br />

Auch werden die Zustände, in denen sich eine Bean befinden kann, vom EJB-Container verwaltet.<br />

Ein weiterer Dienst betrifft die Vergabe und Überprüfung von Zugriffsberechtigungen, die<br />

in deklarativer (beschreibender) Form im Deployment-Deskriptor festgelegt werden. Hierbei<br />

überprüft der EJB-Container zur Laufzeit, ob bestimmte Rechte vorliegen.<br />

Einer der wichtigsten Dienste für verteilte Komponenten ist die Verwaltung von Transaktionen.<br />

Der EJB-Container übernimmt die Transaktionssteuerung. Eine Bean kann jedoch so<br />

konfiguriert werden, daß sie die Transaktionssteuerung selbst durchführt. In diesem Fall


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 24<br />

handelt es sich um eine Bean-managed transaction demarcation, in dem anderen Fall handelt es<br />

sich um eine container-managed transaction-demarcation.<br />

Aus der Sicht eines Entwicklers sind die Dienste bzgl. der Persistenz von Beans diejenigen,<br />

die viel Entwicklungsaufwand sparen. Der EJB-Container übernimmt die Aufgabe der<br />

persistenten Speicherung von Entity-Bean Objekten. Der Entwickler ist bei dieser containermanaged<br />

persistence von der Programmierung von SQL-Anweisungen befreit. Er hat aber<br />

auch die Möglichkeit, diese Aufgabe selbst durchzuführen, wobei dies als bean-managed persistence<br />

bezeichnet wird.<br />

4.5 EJB-Container<br />

Der EJB-Container stellt den Enterprise JavaBeans-Komponenten eine Laufzeitumgebung<br />

zur Verfügung. Weiterhin stellt der EJB-Container den Beans gewisse Dienste in Form von<br />

Standardprogrammierschnittstellen (engl. API, Application Programming Interface) zur Verfügung.<br />

Der Hersteller eines EJB-Containers ist laut der EJB-Spezifikation [Matena, Hapner<br />

99] verpflichtet mindestens folgende Standardprogrammierschnittstellen einer Bean anzubieten:<br />

• API der Java 2-Plattform<br />

• API der Spezifikation der Enterprise JavaBeans 1.1<br />

• API des JNDI 1.2 (Java Naming and Directory Interface)<br />

• API des JTA 1.0.1 (Java Transaction API)<br />

• API der JDBC 2.0-Erweiterung (Java Database Connectivity)<br />

• API von Java Mail<br />

Über die hier aufgeführten Schnittstellen hinaus, ist der EJB-Container Hersteller berechtigt,<br />

zusätzliche Schnittstellen anzubieten.<br />

4.6 Transaktionen<br />

Das EJB-Komponentenmodell unterstützt auch Transaktionen. Wie in [Matena, Hapner 99]<br />

beschrieben werden zur Zeit nur flache Transaktionen unterstützt, d.h. innerhalb einer Transaktion<br />

können keine verschachtelten Transaktionen existieren. Wegen fehlender oder nur<br />

geringer Unterstützung von verschachtelten Transaktionen in existierenden Transaktionsund<br />

Datenbank-Systemen wurde darauf verzichtet. In zukünftigen EJB-Versionen könnte<br />

sich dies jedoch ändern.<br />

In der EJB-Spezifikation [Matena, Hapner 99] wird der Transaktionskontext durch Propagation,<br />

also durch Weiterreichung, zwischen den verschiedenen Servern weitergegeben.


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 25<br />

4.7 EJB-Rollen<br />

In diesem Abschnitt und den folgenden Unterabschnitten werden die einzelnen Rollen, die<br />

mit dem EJB-Standard eingeführt wurden, erläutert.<br />

Durch die Aufteilung der Entwicklungsverantwortlichkeiten in diverse Rollen soll eine gewisse<br />

Abstraktion im EJB-Modell erreicht werden. Durch die Aufteilung der Verantwortlichkeiten<br />

wird eine Strukturierung des Entwicklumgsprozesses von EJBs erreicht, die eine<br />

arbeitsteilige Entwicklung und Wartung erleichtern soll.<br />

4.7.1 EJB Server-Provider<br />

Der EJB Server-Provider (kurz Server-Provider) wird in [Matena, Hapner 99] als ein Spezialist<br />

auf dem Gebiet der Implementierung systemnaher Dienste beschrieben. Typische<br />

Server-Provider sind z.B. Hersteller von Betriebssystemen, Hersteller von Middleware oder<br />

Datenbank-Hersteller.<br />

Der Server-Provider ist zuständig für die Bereitstellung einer Laufzeitumgebung für die unterschiedlichen<br />

Container, vor allem den EJB-Containern (siehe Abschnitt 4.5). Dazu zählen<br />

u.a. die Netzwerkanbindung, Thread- und Prozeßmanagement sowie das Ressourcenmanagement.<br />

4.7.2 EJB Container-Provider<br />

Der EJB Container-Provider (kurz Container-Provider) bietet den Enterprise Beans eine Laufzeitumgebung<br />

und verwendet die vom Server-Provider bereitgestellten Dienste. In [Matena,<br />

Hapner 99] wird davon ausgegangen, daß die Server-Provider Rolle und die Container-<br />

Provider Rolle einem Hersteller zugeordnet werden. Dies hat zur Folge, daß ein EJB-Container<br />

in der Praxis nicht in EJB Servern anderer Hersteller lauffähig ist. Die Trennung zwischen<br />

diesen beiden Rollen ist eine logische. Es ist dem Hersteller von EJB Servern überlassen, wie<br />

er die geforderten Leistungen zwischen dem EJB Container und dem EJB Server aufteilt. Der<br />

Container-Provider kapselt die Enterprise Beans von den technischen Eigenschaften des darunterliegenden<br />

EJB Servers durch die Bereitstellung einer einfachen API (Application Programming<br />

Interface) zwischen der Enterprise Bean und dem Container. Diese standardisierte<br />

API wird in [Matena, Hapner 99] als Enterprise JavaBeans component contract (Enterprise<br />

JavaBeans Komponentenvertrag) bezeichnet.<br />

Für die Verwaltung des Containers muß der Container-Provider spezielle Programme bereitstellen,<br />

die es dem System-Administrator (siehe 4.7.6) ermöglichen, die installierten Beans<br />

und den Container selbst zu überwachen und zu kontrollieren.<br />

4.7.3 Bean-Provider<br />

Die Rolle des Bean-Provider besteht darin, die eigentliche Business-Logik (Anwendungslogik)<br />

in Form von Komponenten zu implementieren. Bei der Implementierung der Anwendungs-


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 26<br />

logik ist der Bean-Entwickler vollständig von der Entwicklung grundlegender Servertechniken<br />

(Multithreading, Netzwerkanbindung, Transaktionssteuerung etc.) entlastet. Die Implementierung<br />

dieser Dienste übernimmt der Server- und Container-Provider, so daß sich der<br />

Bean-Entwickler ganz auf die Anwendungslogik konzentrieren kann. Der Bean-Provider hat<br />

jedoch immer die Möglichkeit, einen Teil der grundlegenden Servertechniken selbst zu implementieren.<br />

So ist es z.B. zulässig, daß der Bean-Provider die Transaktionsverwaltung oder<br />

die Aspekte des Objekt-Relationalen Mappings selbst in der Bean implementiert. In einem solchen<br />

Fall werden die entsprechenden Dienste des Containers nicht in Anspruch genommen.<br />

Der Bean-Entwickler muß zu seiner Bean immer einen Deployment-Deskriptor (siehe Abschnitt<br />

4.8) liefern, der wichtige Informationen über die Bean selbst sowie über externe Abhängigkeiten<br />

der Bean (z.B. auf welche Serverdienste sie angewiesen ist) enthält.<br />

Die Beans zusammen mit den Deployment-Deskriptoren übergibt der Bean-Provider dem<br />

Application-Assembler, der im folgendem Abschnitt behandelt wird.<br />

4.7.4 Application-Assembler<br />

Die Aufgaben des Application-Assemblers bestehen darin, mehrere (kleinere) Komponenten,<br />

die er von Bean-Providern erhält, zu einer neuen (größeren) Komponente zusammenzufassen.<br />

Mit den Beans erhält der Application-Assembler immer ein oder mehrere ejb-jar Dateien<br />

vom Bean-Provider.<br />

Der Application-Assembler dokumentiert seine Arbeit im Deployment-Deskriptor. Er trägt<br />

z.B. Informationen über verwendete Ressourcen oder Abhängigkeiten zu Nicht-EJB-Komponenten<br />

in den Deployment-Deskriptor ein.<br />

4.7.5 Deployer<br />

Die von dem Container-Provider bereitgestellten Programme zur Verwaltung des Containers<br />

und der installierten Beans stellen die Hauptaufgabe des Deployers dar. Mit Hilfe dieser<br />

Werkzeuge installiert der Deployer die Beans in einen Container. Weiterhin ist der Deployer<br />

dafür zuständig, die im Deployment-Deskriptor aufgeführten externen Abhängigkeiten<br />

aufzulösen sowie die Anweisungen des Application-Assemblers zu berücksichtigen.<br />

4.7.6 System-Administrator<br />

Aus der Sicht der EJB-Spezifikation ist der System-Administrator zuständig für die Konfiguration<br />

und Administration der Netzwerk-Infrastruktur (vergl. [Matena, Hapner 99]). Die<br />

Konfiguration und Administration des EJB-Servers und des EJB-Containers sind hier ebenfalls<br />

eingeschlossen.<br />

Als Beispiel läßt sich hier die Integration von Ressourcen-Managern (z.B. Datenbanken) in<br />

EJB-Containern nennen. Eine weitere Aufgabe des System-Administrators ist es, die installierten<br />

Komponenten zur Laufzeit zu überwachen.


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 27<br />

4.8 Deployment-Deskriptor<br />

Einer der wichtigsten Faktoren für die Portabilität der Beans ist der Deployment-Deskriptor.<br />

Er beinhaltet nicht nur allgemeine Informationen, wie z.B. den Namen der Bean und die Namen<br />

ihres Home- und Remote-Interface, sondern auch Informationen für den EJB-Container,<br />

wie dieser u.a. das transaktionale Verhalten, die Persistenz, die Autorisierung der Enterprise<br />

JavaBean verwalten soll.<br />

Dadurch, daß die wichtigen Informationen über eine Bean in dem Deployment-Deskriptor<br />

gespeichert werden, wird die Portabilität (d.h. genauer die Lauffähigkeit der Bean in verschiedenen<br />

EJB-Containern unterschiedlicher Hersteller) der Enterprise JavaBeans erst möglich.<br />

In Abbildung 4.8 ist beispielhaft ein Deployment-Deskriptor aufgeführt.<br />

Die Hauptaufgabe des Deployment-Deskriptors ist es, die deklarativen Informationen über<br />

die Enterprise Beans zusammenzufassen. Damit sind Informationen gemeint, die nicht direkt<br />

in den Enterprise Beans gespeichert werden. Bei dem Deployment-Deskriptor handelt<br />

es sich zunächst um eine Text-Datei, die mit jedem beliebigen Text-Editor bearbeitet werden<br />

kann. Dadurch werden Änderungen an dieser Datei recht einfach und schnell durchführbar.<br />

Wie in der Abbildung 4.8 zu sehen ist, ist der Deployment-Deskriptor entsprechend<br />

der XML-Syntax aufgebaut (engl., Extendible Markup Language). In der letzten EJB-<br />

Spezifikation (EJB 1.0) wurde der Deployment-Deskriptor durch eine spezielle Klasse implementert,<br />

die nach ihrer Initialisierung mit den entsprechenden Werten serialisiert wurde. Die<br />

Änderung eines Parameters hatte zur Folge, daß die Klasse zunächst deserialisiert werden<br />

mußte, anschließend die Änderung durchgeführt und schließlich wieder serialisiert werden<br />

mußte.<br />

Durch den nun XML-basierten Deployment-Deskriptor ist die Änderung von Parametern<br />

vereinfacht worden. Nähere Informationen zum Thema XML können z.B. in [Ray 01] oder<br />

[XML ] nachgelesen werden.<br />

4.9 Portabilität und Enterprise JavaBeans<br />

In diesem Abschnitt wird vorgestellt, welche Art von Portabilität der EJB-Standard bietet.<br />

Enterprise JavaBeans-Komponenten, die entsprechend der Spezifikation entworfen wurden,<br />

können ohne weitere Modifikation an der Geschäftslogik in anderen EJB-Servern installiert<br />

werden.<br />

Die Hilfswerkzeuge des EJB-Servers müssen lediglich die Klassen für die Netzwerkkommunikation<br />

erstellen. Die Bean-Klassen werden nicht neu übersetzt. Bei den Klassen für die<br />

Netzwerkkommunikation handelt es sich um die Implementierung der sog. Stubs und Skeletons<br />

und des EJB-Objektes, vom dem das Remote-Interface die Funktionalität erbt.<br />

4.10 Java 2 Plattform, Enterprise Edition<br />

Die Java 2 Plattform, Enterprise Edition (J2EE) wurde von [Sun ] entwickelt. Ziel der J2EE-<br />

Architektur ist es, die Portabilität von vollständigen mehrschichtigen Anwendungen auf<br />

unterschiedlichen J2EE-konformen Application-Servern zu realisieren.


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 28<br />

<br />

<br />

<br />

<br />

<br />

<br />

This Cabin enterprise bean entity represents a cabin on<br />

a cruise ship.<br />

<br />

CabinBean<br />

com.titan.cabin.CabinHome<br />

com.titan.cabin.Cabin<br />

com.titan.cabin.CabinBean<br />

Container<br />

com.titan.cabin.CabinPK<br />

False<br />

id<br />

name<br />

deckLevel<br />

ship<br />

bedCount<br />

<br />

<br />

<br />

<br />

<br />

This role represents everyone who is allowed full access<br />

to the cabin bean.<br />

<br />

everyone<br />

<br />

<br />

everyone<br />

<br />

CabinBean<br />

*<br />

<br />

<br />

<br />

<br />

CabinBean<br />

*<br />

<br />

Required<br />

<br />

<br />

<br />

Abbildung 4.1: Beispiel eines Deployment-Deskriptors


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 29<br />

Eine J2EE-Anwendung besteht in der Regel aus einer oder mehreren Enterprise Beans, Web<br />

Komponenten und J2EE Application Clients. Der Aufbau einer solchen J2EE Applikation ist<br />

in Abbildung 4.2 dargestellt. Jedes Package (.jar, .war oder .ear - Dateien) enthält einen XML<br />

Deployment-Deskriptor, der die jeweilige Komponente beschreibt. Die verschiedenen Teile<br />

einer solchen J2EE-Anwendung können unabhängig voneinander, anhand ihrer Schnittstellen<br />

implementiert werden.<br />

J2EE Application<br />

J2EE App. DD<br />

(DD= Deployment−Descriptor)<br />

.ear file<br />

J2EE App. Client<br />

Enterprise Java Bean<br />

Web Component<br />

J2EE App. Client DD<br />

Java App.<br />

.jar file<br />

EJB DD<br />

EJB Class<br />

Remote<br />

Home<br />

.jar file<br />

Web Component DD<br />

JSP File<br />

Servlet Class<br />

GIF File<br />

HTML File<br />

.war file<br />

Abbildung 4.2: Bestandteile einer J2EE Anwendung<br />

Die Java 2 Platform, Enterprise Edition (J2EE) definiert den Standard für die Entwicklung<br />

mehrschichtiger Unternehmensanwendungen. Der J2EE-Standard trägt zu einer Vereinfachung<br />

der Unternehmensanwendungen bei, da er diese aus standardisierten und modularen<br />

Komponenten zusammenfügt, umfassende Dienste für diese Komponenten bereitstellt<br />

und zahlreiche Aspekte des Anwendungsverhaltens ohne großen Programmieraufwand automatisch<br />

verwaltet (vergl. [J2EE ]).<br />

Die Java 2 Platform, Enterprise Edition stellt viele Leistungsmerkmale der Java 2 Plattform,<br />

Standard Edition bereit, darunter die<br />

• "Write Once, Run Anywhere“-Portabilität,


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 30<br />

• die JDBC-API für den Datenbankzugriff,<br />

• die CORBA-Technologie für die Interaktion mit vorhandenen Unternehmensressourcen,<br />

• ein Sicherheitsmodell zum Schutz der Daten in Internetanwendungen.<br />

Zusätzlich dazu bietet die Java 2 Plattform, Enterprise Edition auch volle Unterstützung für<br />

folgende Programmierschnittstellen:<br />

• Enterprise JavaBeans-Komponenten,<br />

• Java Servlets<br />

• sowie Java ServerPages und XML-Technologie<br />

Der J2EE-Standard schreibt umfassende Spezifikations- und Konformitätstests vor, um die<br />

Portierbarkeit von Applikationen für die breite Palette vorhandener J2EE-fähiger Unternehmenssysteme<br />

sicherzustellen (vergl. [J2EE ]).<br />

Der wichtigste Bestandteil von J2EE ist das EJB-Komponentenmodell. Das EJB-Komponentenmodell<br />

bildet das Grundgerüst für den J2EE-Standard.<br />

Die J2EE-Architektur ist in Abbildung 4.3 zu sehen (aus [Sun 01]). In der Abbildung 4.3 sind<br />

zwei Hauptbestandteile der J2EE zu sehen: der EJB-Container und der Web-Container.<br />

Durch J2EE soll es möglich werden, vollständige Anwendungen ohne Modifikation der Anwendungslogik<br />

auf verschiedene J2EE-konforme Application-Server zu installieren. Bei den<br />

bisherigen konventionellen Lösungen ist es nicht möglich, komplette Anwendungen von einem<br />

Hersteller zu einem anderen zu migrieren. Die Ursache hierfür liegt in der Tatsache,<br />

daß es keinen einheitlichen Standard gibt und jeder Hersteller daher sein eigenes Verfahren<br />

entwickelt hat.<br />

Design Tipps zu EJB Komponenten und J2EE finden sich z.B. in [Marinescu 02].<br />

An dieser Stelle soll nicht näher auf J2EE eingegangen werden, es sollte in diesem Abschnitt<br />

lediglich der Zusammenhang zwischen dem EJB-Komponentenmodell und J2EE aufgezeigt<br />

werden. In dem nun folgenden Kapitel werden die Eigenschaften und Merkmale<br />

eines Application-Servers vorgestellt und erläutert. Die Application-Server nehmen im EJB-<br />

Komponentenmodell eine wichtige Rolle ein.


KAPITEL 4. ENTERPRISE JAVABEANS KOMPONENTENMODELL 31<br />

J2EE Server<br />

EJB Container<br />

Client<br />

(Web Browser)<br />

Web Container<br />

Enterprise<br />

Bean<br />

JSP File<br />

Enterprise<br />

Bean<br />

Datenbank−<br />

Server<br />

Servlet<br />

Enterprise<br />

Bean<br />

Client<br />

(Java Application)<br />

JMS<br />

JNDI<br />

RMI/IIOP<br />

JDBC<br />

JTA<br />

Java<br />

Mail<br />

JAF<br />

JMS<br />

JNDI<br />

RMI/IIOP<br />

JDBC<br />

JTA<br />

Java<br />

Mail<br />

JAF<br />

JMS<br />

JNDI<br />

RMI/IIOP<br />

JDBC<br />

J2SE<br />

J2SE<br />

J2SE<br />

Abbildung 4.3: Überblick der J2EE Architektur


Kapitel 5<br />

Application-Server<br />

In Kapitel 4 wurde das Enterprise JavaBeans Komponentenmodell ausführlich vorgestellt.<br />

Zur praktischen Nutzung dieses Modells ist eine Implementierung in Gestalt eines Application-Servers<br />

erforderlich. Erst mit Hilfe der Application-Server können die Komponenten<br />

ihre Dienste anbieten. Der Schwerpunkt dieses Kapitels ist daher, das Zusammenspiel von<br />

Application-Server und Komponenten zu zeigen.<br />

Um ein besseres Verständnis für die Application-Server zu bekommen, wird zunächst in Abschnitt<br />

5.1 gezeigt, wie sich die Anwendungssystem-Architekturen entwickelt haben. Abschnitt<br />

5.1.1 beschreibt dabei die Entwicklungsstufe der Großrechner-Architektur, Abschnitt<br />

5.1.2 die Stufe der Client-Server Architektur und Abschnitt 5.1.3 schließlich die Mehrschichten<br />

Architektur, die für die Application-Server relevant ist.<br />

In Abschnitt 5.2 werden zum Abschluß dieses Kapitels die von Application-Servern üblicherweise<br />

angebotenen Dienste aufgeführt.<br />

Es ist zu berücksichtigen, daß viele Prinzipien der Softwareentwicklung wie. z.B. modularer<br />

Aufbau und Trennung von Anwendungs-, Präsentations- und Datenhaltungslogik schon<br />

seit längerer Zeit bekannt sind, die Leistungsfähigkeit der Netzwerke (z.B. Ethernet) jedoch<br />

den Einsatz flexibler Architekturen wie die Mehrschichtenarchitektur verhinderte. Die Antwortzeiten<br />

waren so lang, daß ein praktischer Einsatz von Anwendungen, die auf mehreren<br />

Rechnern verteilt waren, nicht möglich war.<br />

5.1 Evolution der Anwendungssystem-Architekturen<br />

In diesem Abschnitt wird die Entwicklung von der Großrechner-Architektur, über die zwei-<br />

Schichten Architektur bis zu der drei-Schichten Architektur dargestellt.<br />

Zur Klassifikation wird dabei die Verteilung folgender Aufgabenbereiche verwendet:<br />

• Präsentationslogik<br />

Hierunter wird die Implementierung der graphischen Benutzerschnittstelle verstanden.<br />

Unter dem Begriff „Präsentationslogik“ wird jeglicher Programmcode verstanden,<br />

der für die visuelle Darstellung von Anwendungsinformationen zuständig ist.<br />

32


KAPITEL 5. APPLICATION-SERVER 33<br />

• Anwendungslogik.<br />

• Datenhaltung.<br />

Für die Datenhaltung hat sich das relationale Datenbankmodell durchgesetzt. In der Praxis<br />

wird als Datenspeicher fast ausschließlich ein Datenbanksystem eingesetzt. Hierunter<br />

wird die Art des Datenspeichers verstanden.<br />

5.1.1 Großrechner Architektur<br />

Bis Mitte der 80’er Jahre war die Großrechner-Architektur sehr verbreitet. Diese sehr leistungsfähigen<br />

Großrechner wurden als Host oder aber auch Mainframe bezeichnet. Kennzeichnend<br />

für Mainframes ist, daß zahlreiche Terminals (Datensichtstation, vergl. [Duden<br />

93]) an einem Host angeschlossen sind. Diese Terminals bestehen i.d.R. aus einer Tastatur<br />

und einem zeichenorientierten Bildschirm. Sie sind im Prinzip nur in der Lage, eine Verbindung<br />

zum Mainframe herzustellen sowie Text zu senden und zu empfangen.<br />

In Abbildung 5.1 wird schematisch die Großrechner Architektur dargestellt.<br />

Mainframe<br />

Präsentationslogik<br />

GeschäftsKomponente1<br />

Terminal<br />

Datenhaltung<br />

GeschäftsKomponente2<br />

1..*<br />

Abbildung 5.1: Großrechner Architektur<br />

Wie in Abbildung 5.1 zu sehen ist, sind alle Programmteile auf einem Mainframe positioniert.<br />

Die Anwendungslogik, die Präsentationslogik und die Datenverwaltung liegen zentral<br />

auf einem Mainframe und können so zentral gewartet werden .<br />

Die Vorteile der Mainframes sind vor allem die Zuverlässigkeit und das große Leistungspotential.<br />

Sie sind daher in der Lage, eine vielzahl von Benutzern zu unterstützen.


KAPITEL 5. APPLICATION-SERVER 34<br />

Der Einsatz von Mainframes bringt jedoch auch Nachteile mit sich. Zu nennen sind hier vor<br />

allem der sehr hohe Preis und die langen Software Entwicklungszyklen. Trotz zentralisierter<br />

Datenhaltung, sind die zu entwickelnden Anwendungen sehr komplex, da alle Programmteile<br />

einer Anwendung – Präsentationslogik, Anwendungslogik, Datenhaltung – in einer<br />

einzigen Anwendung implementiert und gewartet werden müssen. Bei Wartungsarbeiten<br />

mußten alle Applikationen auf diesem Host gestoppt werden. Ein weiteres Problem mit den<br />

Mainframes ist die Ausfallsicherheit. Wenn ein Mainframe wegen hardware Problemen ausgefallen<br />

war, war kein arbeiten möglich. Auch die Terminals sind aufgrund ihrer Zeichenorientierung<br />

für die Darstellung komplexer Information wenig geeignet. Graphische Terminals<br />

wurden erst später eingeführt, konnten aber die oben aufgeführten Nachteile nicht vollständig<br />

beheben.<br />

Aufgrund der Tatsache, daß die Mainframes sowohl die Anwendungslogik als auch die Präsentationslogik<br />

enthielten spricht man auch von der sog. ein-Schichten Architektur.<br />

Erst durch die im nächsten Abschnitt erläuterte Client-Server Architektur konnten einige<br />

Nachteile der Großrechner Architektur behoben werden.<br />

5.1.2 Client-Server Architektur<br />

Ende der 80’er Jahre wurde die Großrechner-Architektur mehr und mehr durch die Client-<br />

Server Architektur abgelöst. Die Ursache hierfür waren die mittlerweile im Computer-Markt<br />

verfügbaren Personal Computer (PCs), die über ausreichend Rechenleistung verfügten. Dies<br />

ebnete den Weg für die Client-Server Architektur.<br />

Die teuren Mainframes konnten nun durch zahlreiche, günstige und leistungsfähige PCs ersetzt<br />

werden. Die sich so ergebende Client-Server Architektur wird auch als zwei-Schichten<br />

Architektur bezeichnet.<br />

Abbildung 5.2 zeigt den schematischen Aufbau einer zwei-Schichten Architektur. Die eine<br />

Schicht wird durch den Client repräsentiert. Die zweite Schicht wird durch einen Server<br />

repräsentiert, auf dem ein Datenbankserver läuft.<br />

Client<br />

GUI<br />

BusinessComponent1<br />

1..*<br />

Server<br />

Datenbank<br />

BusinessComponent2<br />

Abbildung 5.2: Client-Server Architektur<br />

Da die Rechenleistung der PCs ausreichend war um einige Berechnungen durchzuführen,


KAPITEL 5. APPLICATION-SERVER 35<br />

hat man einen Teil der Anwendungslogik auf die Client-PCs verlagert, um so den Server (ein<br />

leistungsfähiger PC) zu entlasten und die vorhandene Rechenleistung auf den Clients besser<br />

zu nutzen. Auf dem Server läuft in der Regel eine Datenbank, in der ein großer Teil der Anwendungslogik<br />

implementiert sein kann. Abhängig von Verteilung der Anwendungslogik<br />

auf Client und Server unterscheidet man zwei Arten von Clients:<br />

• Fat Client.<br />

Unter einem Fat Client versteht man in der Regel eine Software, die neben der graphischen<br />

Benutzerschnittstelle einen Großteil der Anwendungslogik ausführt.<br />

• Thin Client.<br />

Ein Thin Client ist ein Computer, der außer der graphischen Benutzerschnittstelle sehr<br />

wenig Anwendungslogik enthält. Thin Clients sind z.B. Web-Browser. In einem solchen<br />

Fall handelt es sich um webbasierte Thin-Clients.<br />

Zu den Vorteilen der zwei-Schichten Architektur zählen:<br />

• Es lassen sich relativ schnell Anwendungen für die zwei-Schichten Architektur entwickeln.<br />

• Die Einführung von RAD-Werkzeugen (Rapid Application Development, deutsch: schnelle<br />

Anwendungsentwicklung).<br />

Durch die Einführung von RAD-Werkzeugen wurden die graphischen Benutzerschnittstellen<br />

benutzerfreundlicher. Auch wurde durch die leistungsfähigen RAD-Werkzeuge<br />

der Entwicklungszyklus für Client-Server Anwendungen sehr verkürzt.<br />

Obwohl die zwei-Schichten Architektur gegenüber der Großrechner Architektur einige Vorteile<br />

aufweisen kann, überwiegen die Nachteile einer solchen Architektur:<br />

• Enge Verzahnung von Anwendungslogik, Präsentationslogik und Datenhaltung bereitet<br />

bei der Programmwartung erhebliche Probleme.<br />

So ziehen z.B. kleinste Änderungen an Tabellen auf dem Datenbank-Server Modifikationen<br />

in allen Clients nach sich, da alle Clients die Anwendungslogik besitzen.<br />

• Ein Fehler in der Anwendungslogik kann die Datenintegrität der Datenbank beeinflussen,<br />

da alle Clients die Anwendungslogik besitzen.<br />

• In Unternehmen mit einer großen Anzahl von Clients ist die Verwaltung der Clients<br />

sehr aufwendig.<br />

Um den Aufwand gering zu halten, müssen alle Clients einheitlich sein.<br />

• Die Skalierbarkeit ist eingeschränkt.<br />

Jede Client-Anwendung benötigt eine eigene Verbindung zu der Datenbank. Die Anzahl<br />

der offenen Datenbank-Verbindungen ist jedoch meistens durch das eingesetzte<br />

Datenbankprodukt eingeschränkt. Daher bildet das eingesetzte Datenbanksystem in<br />

den meisten Fällen einen sog. Flaschenhals.


KAPITEL 5. APPLICATION-SERVER 36<br />

• Die Anwendung ist an eine feste Darstellung gebunden, die in den Clients in Form der<br />

Präsentationslogik implementiert ist.<br />

Ein Wechsel der Darstellung ist nur durch eine Neuimplementierung der Präsentationslogik<br />

möglich. Dies bedeutet jedoch eine Neuinstallation der Anwendung auf<br />

sämtlichen Clients.<br />

• Das Netzwerk wird durch die zahlreichen Datentransfers von Clients zum Server stark<br />

belastet.<br />

Wie man aus dem direkten Vergleich der Vor- und Nachteile ersehen kann, überwiegen<br />

die Nachteile der zwei-Schichten Architektur. Da die zwei-Schichten Architektur zahlreiche<br />

Nachteile und Einschränkungen besitzt, hat man nach besseren Lösungsansätzen gesucht.<br />

Als letzte Entwicklungsstufe der Anwendungssystem-Architekturen hat sich die Mehrschichten<br />

Architektur durchgesetzt, die in dem Folgenden Abschnitt behandelt wird.<br />

5.1.3 Mehrschichten Architektur<br />

Mit Hilfe der Mehrschichten Architektur lassen sich die Einschränkungen der zwei-Schichten<br />

Architektur mindern.<br />

Ein typischer Vertreter der Mehrschichten Architektur ist die sog. drei-Schichten Architektur<br />

(im engl.: 3-tier architecture). Wie in [Saake, Sattler 00] beschrieben, wird bei der drei-<br />

Schichten Architektur eine zusätzliche Schicht zwischen Client und Server eingeführt. Die<br />

Anwendungslogik ist dann in dieser Schicht gekapselt (vergl. Abbildung 5.3), wodurch ein<br />

Application-Server entsteht. Alle Zugriffe auf den Datenbank-Server (DB-Server) werden<br />

nur vom Application-Server durchgeführt. Die Clients haben folglich keinen direkten Zugriff<br />

auf den DB-Server, im Gegensatz zu der zwei-Schichten Architektur.<br />

Die Clients können nun höherwertige Dienste des Applikationsservers in Form von Funktionen<br />

oder gar Objekten in Anspruch nehmen. Solche Dienste können z.B. das Suchen eines<br />

Kunden oder das Anlegen einer Bestellung sein.<br />

Die drei-Schichten Architektur ist insbesondere dann geeignet, wenn die Anwendungslogik<br />

in mehreren verschiedenen Clients genutzt werden soll. Gängige Clients sind mittlerweile:<br />

• Web-Browser<br />

• Java-Anwendungen<br />

• Spezielle Geräte, wie z.B. PDAs, Mobiltelefone<br />

Die dritte Schicht (der Server) dient der Datenhaltung. Hier sind insbesondere Datenbanksysteme<br />

zu finden.<br />

Zu bemerken ist noch, daß die Abstraktion der verschiedenen Aufgabenbereiche lediglich<br />

logische Grenzen kennzeichnet. In der Praxis können die unterschiedlichen Aufgaben durchaus<br />

auf einem System ausgeführt werden.<br />

In dem nun folgenden Abschnitt werden die von einem Application Server angebotenen<br />

Dienste tiefer behandelt.


KAPITEL 5. APPLICATION-SERVER 37<br />

Application-Server<br />

Client<br />

Client<br />

GeschäftsKomponente1<br />

1..*<br />

Datenbank-Server<br />

Datenbank<br />

1..*<br />

Präsentationslogik<br />

GeschäftsKomponente2<br />

Abbildung 5.3: Drei-Schichten Architektur<br />

5.2 Angebotene Dienste<br />

Die generell von einem Application-Server angebotenen Dienste und desssen Aufgabe lassen<br />

sich verdeutlichen, indem man den Application-Server aus der Mehrschichten-Architektur<br />

nicht betrachtet. Dieses ist in Abbildung 5.4 zu sehen. In dieser Abbildung sind verschiedene<br />

Clients abgebildet, wie z.B. HTML-Clients, Corba-Clients, D/COM-Clients oder Java<br />

Applikationen. All diese Clients benötigen einen Zugriff auf bestimmte Ressourcen, wie z.B.<br />

bestimmte Alt-Anwendungen, Datenbanken oder Dateien.<br />

Zu den allgemeineren Diensten eines Application-Servers zählen das connection management<br />

von unterschiedlichen Clients, das Zustands- und Sitzungsmanagement sowie die Anbindung<br />

an Datenbanksysteme. Das hosting von Anwendungslogik zählt hierbei zu den wichtigsten<br />

Diensten eines Application-Servers.<br />

Um diese Dienste den unterschiedlichen Clients anbieten zu können, muß ein Application-<br />

Server auch viele verschiedene Kommunikations- und Übertragungsprotokolle bereitstellen.<br />

Daraus folgt die primäre Aufgabe eines Application-Servers: die Weiterleitung von Client-<br />

Anfragen an unterschiedliche Ressourcen. Dieser Sachverhalt wird in Abbildung 5.5 duch<br />

die Rolle der Application-Server in der Mehrschichten-Architektur deutlich.<br />

Neben all diesen primären Diensten bieten die Application-Server weitere an, wie z.B. (vergl.<br />

[InfoWeek 00]):<br />

• Koordination von Transaktionen<br />

• Lastverteilung<br />

• Sicherheitsmechanismen<br />

• Dienste zum Bedienen von Web-Schnittstellen<br />

Durch die zahlreich angebotenen Dienste wird der Anwendungsentwickler bei der Anwendungsentwicklung<br />

wesentlich unterstützt, was zu einer besseren Produktivität führt. Der<br />

Produktivitätszuwachs durch Applikations-Server hat jedoch seinen Preis: es ist nur schwer


KAPITEL 5. APPLICATION-SERVER 38<br />

möglich, eine bestehende Anwendung auf einen anderen Application-Server eines anderen<br />

Herstellers zu migrieren, da jeder Hersteller ein anderes Rahmenwerk für die Programmentwicklung<br />

bereitstellt.<br />

Genau an diesem Punkt setzt der EJB-Standard an: eine nach der EJB-Spezifikation entworfene<br />

Komponente ist in EJB-Servern verschiedener Hersteller lauffähig.<br />

Die Anzahl und Komplexität der angebotenen Dienste von neuen Application-Servern nimmt<br />

stetig zu.<br />

In den nun folgenden Unterabschnitten werden die allgemeinen Dienste von Application-<br />

Servern näher erläutert (vergl. [Benfield 99]).<br />

Ohne Application−Server<br />

CLIENTS<br />

BACKEND<br />

HTML<br />

Alt−Anwendungen<br />

Java Applikationen<br />

DB<br />

CORBA<br />

D/COM<br />

EJB<br />

Dateien<br />

Spezielle Geräte<br />

(PDA,Set−top−Box)<br />

Abbildung 5.4: Ohne Einsatz eines Application-Servers


KAPITEL 5. APPLICATION-SERVER 39<br />

Mit Application−Server<br />

CLIENTS<br />

BACKEND<br />

Application−Server<br />

HTML<br />

HTTP, CGI, Servlets, JSP<br />

Komponenten<br />

CORBA, EJB/RMI,<br />

D/COM<br />

Alt−Anwendungen<br />

Java Applikationen<br />

Datenzugriff:<br />

JDBC<br />

CORBA<br />

D/COM<br />

EJB<br />

Spezielle Geräte<br />

(PDA,Set−top−Box)<br />

Transaktionsverwaltung<br />

XA,JTS/JTA<br />

Sicherheit:<br />

SSL,ACL,X.509<br />

Verzeichnis−Dienste<br />

JNDI,COS<br />

Fehlertoleranz<br />

Lastausgleich<br />

Ressourcen−Pooling<br />

DB<br />

Dateien<br />

Abbildung 5.5: Mit Einsatz eines Application-Servers


KAPITEL 5. APPLICATION-SERVER 40<br />

5.2.1 Authentifizierung<br />

Um Benutzern den Zugriff auf sensible Daten zu gewähren, die in einer Datenbank gespeichert<br />

sind, muß der Benutzer authentifiziert werden. Für diese Anforderung stellen die<br />

Application-Server einen Authentifizierungs-Dienst bereit.<br />

5.2.2 Skalierbarkeit<br />

Sollte sich die Produktionsumgebung eines Application-Servers ändern, z.B. durch eine Zunahme<br />

der Benutzerzahl, ist es möglich, einen weiteren oder mehrere Application-Server<br />

hinzuzufügen, die dann gemeinsam die gestiegene Last verarbeiten können. Wichtig ist hierbei,<br />

daß die Anwendungen auf dem Application-Server hiervon unberührt sind.<br />

5.2.3 Lastausgleich und Ausfallsicherheit<br />

Der Begriff Lastausgleich (im engl.: load-balancing) bezeichnet bei einem Application-Server<br />

einen Mechanismus, bei dem mehrere Application-Server einen sog. Cluster bilden. Alle<br />

Application-Server eines Clusters bekommen die Anfragen der Clients von einem zentralen<br />

Rechner. Dieser sog. request-dispatcher, der für den Lastausgleich zuständig ist, leitet Client-<br />

Anfragen an den am geringsten ausgelasteten Application-Server weiter. Von diesem Zeitpunkt<br />

an kommuniziert der Client direkt mit dem Application-Server.<br />

Bei steigenden Benutzerzahlen nimmt die Last auf den Application-Servern zu. Durch Hinzufügen<br />

von weiteren Application-Servern kann die Last wieder verringert werden. Daher<br />

ist das load-balancing ein Mechanismus, der die Skalierbarkeit von Application-Servern mitbestimmt.<br />

Ausfallsicherheit (im engl. fail-over) im Zusammenhang mit Application-Servern ist ein Mechanismus,<br />

der in gewissem Maße Fehlertoleranz bietet. Beim Ausfall eines Application-<br />

Servers aus dem Cluster, werden neue Anfragen nicht mehr an den ausgefallenen Application-Server<br />

weitergeleitet, sondern an einen der anderen im Cluster. Ausfallsicherheit wird<br />

daher oft nur in Zusammenhang mit Lastausgleich angeboten.<br />

5.2.4 Transaktionssteuerung<br />

Die auf den Application-Servern abgelegte Anwendungslogik muß beim Zugriff auf Ressourcen<br />

durch den Einsatz von Transaktionen gesichert werden. Die Aufgabe des Application-Servers<br />

ist hierbei die Kontrolle und Steuerung der Transaktionen sowie die Koordination<br />

von Transaktionen.<br />

5.2.5 Datenbankzugriff<br />

Eine der wichtigsten Anforderungen an Softwaresysteme ist die dauerhafte Speicherung<br />

von Daten bzw. Informationen. Als Datenspeicher werden zur Zeit hauptsächlich relationale


KAPITEL 5. APPLICATION-SERVER 41<br />

Datenbanken eingesetzt. Alle zur Zeit verfügbaren Application-Server bieten daher Schnittstellen<br />

an, mit deren Hilfe auf diverse relationale Datenbanken zugegriffen werden kann.<br />

Schnittstellen für den Zugriff auf Daten, die nicht in relationalen Datenbanken abgelegt sind,<br />

sind nicht im Umfang jedes Application-Servers enthalten.<br />

5.2.6 Zustands- und Sitzungssteuerung<br />

Während der Sitzungsdauer eines Benutzers, muß der Application-Server Zustandsdaten<br />

zwischen den einzelnen Anfragen speichern. Ein von Application-Servern zur Speicherung<br />

von Sitzungsdaten oft angebotener Lösungsansatz liegt im Einsatz von sog. Sitzungs-Objekten<br />

(im engl. session objects ). Deren Hauptaufgabe ist es, die während einer Sitzungsdauer<br />

eines Benutzers anfallenden Daten auf dem Server zu speichern, bis diese nicht mehr benötigt<br />

werden.<br />

Durch die Speicherung von Sitzungsinformation auf dem Application-Server wird die Entwicklung<br />

von Anwendungen vereinfacht.<br />

5.2.7 HTML-Generierung<br />

Bei den sog. browsergestützten thin-clients muß der Application-Server das HTTP-Protokoll<br />

(engl. hypertext transfer protocol) „verstehen“. Neben dem Beantworten von Client-Anfragen,<br />

muß der Application-Server natürlich auch HTML-Code generieren und ggf. mit Daten<br />

aus einer oder mehreren Datenbanken anreichern.<br />

Wie man anhand der hier aufgeführten Aufgaben und angebotenen Dienste sehen kann,<br />

ist ein Application-Server hauptsächlich ein Vermittler zwischen verschiedenen Systemen.<br />

Diese Eigenschaft is das Kennzeichen der sog. Middleware, die eine zentrale Rolle bei den<br />

EJB-Servern hat.


Kapitel 6<br />

Installation einer Beispielanwendung<br />

in EJB-Servern<br />

In diesem Kapitel wird zunächst in Abschnitt 6.1 eine Beispielanwendung vorgestellt und<br />

beschrieben. Im Abschnitt 6.1.1 wird die Beispielanwendung dann als EJB-Anwendung realisiert.<br />

In Abschnitt 6.2 wird die Entwicklungs- und Testumgebung beschrieben, in der die<br />

Anwendung entwickelt und getestet wird. Anschliessend werden in Abschnitt 6.3 die Kriterien<br />

erläutert, die zwischen den verschiedenen Application-Servern verglichen werden sollen.<br />

Als nächster Schritt wird die Beispiel-Anwendung in den Abschnitten 6.4, 6.5 sowie Abschnitt<br />

6.6 in verschiedenen Application-Servern installiert. Zum Abschluß dieses Kapitels<br />

werden in Abschnitt 6.7 die vorgestellten Vergleichs-Kriterien aus Abschnitt 6.3 ausgewertet.<br />

6.1 Beispielanwendung<br />

In Abbildung 6.1 ist das UML-Diagramm der hier behandelten Beispielanwendung dargestellt.<br />

Bei UML (engl. Unified Modelling Language) handelt es sich um eine Standard Notation<br />

für die Modellierung objektorientierter Systeme. Unterstützend wird UML bei der<br />

Analyse und dem Entwurf objektorientierter Systeme eingesetzt. Eingeführt wurde UML<br />

zwischen 1995 und 1997. Eine ausführlichere Behandlung von UML kann z.B. in [Fowler,<br />

Scott 99] oder [Larman 01] nachgelesen werden.<br />

Das in Abbildung 6.1 dargestellte konzeptuelle Modell der Beispielanwendung realisiert<br />

einen Dienst, der das Verknüpfen von einfachen Objekten zu komplexen Objekten erlaubt.<br />

Die einfachen Objekte werden hierbei durch die Klassen SubjectHeading und Content<br />

dargestellt. Komplexe Objekte werden durch die Klasse ElementaryWork dargestellt. Ein<br />

ElementaryWork-Objekt bindet genau ein SubjectHeading-Objekt und ein Content-<br />

Objekt. Die Komplexität ergibt sich nicht nur durch das Binden von zwei Objekten, sondern<br />

dadurch, daß ein ElementaryWork aus beliebig vielen weiteren ElementaryWork-<br />

Objekten zusammengesetzt sein kann, die ihrerseits jeweils ein SubjectHeading- und ein<br />

Content-Objekt binden.<br />

42


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 43<br />

Um die Anwendung besser zu verstehen, muß man wissen, was genau die einzelnen Klassen<br />

repräsentieren. Die Klasse SubjectHeading repräsentiert Begriffe oder Schlagwörter<br />

und die Klasse Content repräsentiert einen Inhalt mit einer bestimmten Bedeutung. Die<br />

Bindung eines Begriffes an einen Inhalt wird als ElementarWerk bezeichnet, was durch die<br />

Klasse ElementaryWork ausgedrückt wird. Ein ElementarWerk kann als ein Kontext aufgefasst<br />

werden, in dem ein Begriff eine spezielle Bedeutung hat.<br />

Die relevante Klasse in dieser Beispielanwendung ist ElementaryWork. In dieser Klasse<br />

findet sowohl die Bindung der einfachen Klassen Content und SubjectHeading statt als<br />

auch die Algorithmen zum Verwalten von Knoten und Blättern.<br />

Blätter sind ElementaryWork-Objekte, die keine Kinder besitzen, d.h. keine weiteren ElementaryWork-Objekte.<br />

Knoten sind ElementaryWork-Objekte, die Kinder besitzen.<br />

Bei näherer Betrachtung der Klasse ElementaryWork stellt man fest, daß es sich um eine<br />

modifizierte Version des Kompositions Entwurfsmusters handelt. Bei den Entwurfsmustern<br />

(engl. design patterns) handelt es sich um bewährte Lösungsansätze zu immer wiederkehrenden<br />

Entwurfsproblemen. Bei den Lösungsansätzen handelt es sich nicht um fertig codierte<br />

Lösungen, sondern um eine Beschreibung für einen möglichen Lösungsweg. Näheres<br />

zum Thema Entwurfsmuster kann z.B. in [Gamma et al. 95] nachgelesen werden. Das<br />

UML-Diagramm zur häufig eingesetzten Variante des Kompositions Entwurfsmusters ist in<br />

Abbildung 6.2 dargestellt.<br />

Der wichtigste Unterschied zwischen der Beispielanwendung und dem Kompositions Entwurfsmuster<br />

betsteht darin, daß die Blatt-Klasse und die Kompositum-Klasse in der Beispielanwendung<br />

zu einer Klasse zusammengefasst sind. Dieses erleichtert die spätere Realisierung<br />

einer EJB-Anwendung.<br />

Eine weitere wichtige Klasse in der Beispielanwendung ist CompDir. Diese Klasse ist als<br />

zentrales „Verzeichnis“ zu verstehen, in dem jede Bindung zwischen einem Content und<br />

einem SubjectHeading festgehalten wird. Zusätzlich wird der Name des bindenden ElementarWerkes<br />

ebenfalls in diesem Verzeichnis festgehalten. Durch diesen Ansatz hat man<br />

die Möglichkeit, komplexere Auswertungen auf Begriffen, Inhalten und ElementarWerken<br />

durchzuführen. Das Objektmodell erlaubt es, daß ein SubjectHeading von verschiedenen<br />

ElementarWerken gebunden werden kann. Durch den Einsatz eines solchen zentralen<br />

Verzeichnisses hat man dann die Möglichkeit, alle ElementarWerke und Content-Objekte<br />

herauszufinden, an denen ein bestimmtes SubjectHeading gebunden ist.<br />

Voraussetzung hierfür ist, daß an den Stellen, wo eine Bindung vorgenommen wird, das<br />

Verzeichnis aktualisiert werden muß. Zusätzlich muß der Zustand des Verzeichnisses persistent<br />

gespeichert werden.<br />

Ein Ausschnitt der Klasse ElementaryWork ist in Abbildung 6.3 zu sehen.Diese Klasse ist<br />

sowohl im Objektmodell als auch im EJB-Modell identisch, d.h. diese Klasse wird bei der<br />

Überführung in eine EJB-Anwendung nicht modifiziert.<br />

Das in Abbildung 6.1 dargestellte konzeptuelle Modell der Beispielanwendung wird nun in<br />

den folgenden Unterabschnitten schrittweise in ein EJB-Modell überführt.


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 44<br />

Serializable<br />

ElementaryWork<br />

−elementaryWorkVector:Vec<br />

−title:String<br />

−content:Content<br />

−isLeaf:boolean<br />

−DEBUG:boolean<br />

+ElementaryWork<br />

+ElementaryWork<br />

+ElementaryWork<br />

+print:void<br />

+add:boolean<br />

+remove:void<br />

+toString:String<br />

+findSubject:ElementaryWor<br />

+findInAllSubjects:Vector<br />

+contains:boolean<br />

+equals:boolean<br />

+alterElement:boolean<br />

+log:void<br />

Content<br />

+Content<br />

+toString:String<br />

URI:String<br />

SubjectHeading<br />

+SubjectHeading<br />

+toString:String<br />

name:String<br />

children:Enumeration<br />

parent:ElementaryWork<br />

leaf:boolean<br />

subjectHeading:SubjectHea<br />

contentURI:Content<br />

ID:String<br />

debug:boolean<br />

Abbildung 6.1: UML-Klassendiagramm der Beispielanwendung


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 45<br />

interface<br />

Component<br />

0..*<br />

+sampleOperation:void<br />

composite:Composite<br />

Leaf<br />

+sampleOperation:void<br />

composite:Composite<br />

Composite<br />

−componentVector:Vector<br />

+sampleOperation:void<br />

+add:void<br />

+remove:void<br />

+components:Enumeration<br />

composite:Composite<br />

Abbildung 6.2: UML-Klassendiagramm des Kompositions Entwurfsmusters


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 46<br />

import java.util.Vector;<br />

import java.util.Enumeration;<br />

import java.io.Serializable;<br />

public class ElementaryWork implements Serializable {<br />

private Vector elementaryWorkVector = null;<br />

private String title;<br />

private SubjectHeading subjectHeading;<br />

private Content content;<br />

private ElementaryWork parent = null;<br />

private boolean isLeaf;<br />

}<br />

public ElementaryWork(String title, SubjectHeading subjHead, Content cont) {<br />

...<br />

CompDir.add(subjHead.getName(), title, cont.getURI());<br />

}<br />

public boolean add(ElementaryWork elementaryWork) { ... }<br />

public void remove(ElementaryWork elementaryWork) { ... }<br />

public Enumeration getChildren() { ... }<br />

public ElementaryWork getParent() { ... }<br />

public void setLeaf(boolean b) { ... }<br />

public void setParent(ElementaryWork parent) { ... }<br />

public ElementaryWork findSubject(String subj) { ... }<br />

public Vector findInAllSubjects(String subj, boolean exactSearch) { ... }<br />

public boolean alterElement(ElementaryWork elwork) { ... }<br />

public SubjectHeading getSubjectHeading() { ... }<br />

public Content getContentURI() { ... }<br />

Abbildung 6.3: Ausschnitt der Klasse ElementaryWork


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 47<br />

6.1.1 EJB-Komponenten der Beispielanwendung<br />

Die erste EJB-Komponente in der Beispielanwendung ist die Entity-Bean Komponente Work-<br />

Bean, der genau ein ElementaryWork Objekt zugeordnet ist. Das Ergebnis ist in Abbildung<br />

6.4 zu sehen. Bei der EJB-Komponente WorkBean handelt es sich um eine Entity Bean,<br />

deren Persistenz vom EJB-Container verwaltet werden soll (Container Managed Persistence,<br />

CMP). Container Managed Persistence ist an den fehlenden JDBC-Anweisungen in<br />

der Bean-Klasse zu erkennen (vergl. Kapitel 4).<br />

EntityBean<br />

WorkBean<br />

Work<br />

WorkHome<br />

java.lang.String<br />

+work:ElementaryWork<br />

−DEBUG:boolean<br />

−context:EntityContext<br />

+title:String<br />

+setEntityContext:void<br />

+ejbActivate:void<br />

+ejbPassivate:void<br />

+ejbRemove:void<br />

+ejbLoad:void<br />

+ejbStore:void<br />

+unsetEntityContext:void<br />

+WorkBean<br />

+log:void<br />

−nrOfElements:int<br />

+ejbCreate:String<br />

+ejbCreate:String<br />

+ejbPostCreate:void<br />

+ejbPostCreate:void<br />

+findByPrimaryKey:Work<br />

+print:void<br />

+add:boolean<br />

+remove:void<br />

+getAllChildren:Enumeration<br />

+getChildren:Vector<br />

+getParent:ElementaryWork<br />

+setLeaf:void<br />

+toString:String<br />

+findSubject:ElementaryWork<br />

+findInAllSubjects:Vector<br />

+contains:boolean<br />

+getSubjectHeading:SubjectHE<br />

+setSubjectHeading:void<br />

+alterElement:boolean<br />

+getContentURI:Content<br />

+setContentURI:void<br />

+setDebug:void<br />

Serializable<br />

ElementaryWork<br />

−elementaryWorkVector:Vector<br />

−title:String<br />

−content:Content<br />

−isLeaf:boolean<br />

−DEBUG:boolean<br />

+ElementaryWork<br />

+ElementaryWork<br />

+ElementaryWork<br />

+print:void<br />

+add:boolean<br />

+remove:void<br />

+toString:String<br />

+findSubject:ElementaryWork<br />

+findInAllSubjects:Vector<br />

+contains:boolean<br />

+equals:boolean<br />

+alterElement:boolean<br />

+log:void<br />

children:Enumeration<br />

parent:ElementaryWork<br />

leaf:boolean<br />

subjectHeading:SubjectHeadin<br />

contentURI:Content<br />

ID:String<br />

debug:boolean<br />

Content<br />

+Content<br />

+toString:String<br />

URI:String<br />

SubjectHeading<br />

+SubjectHeading<br />

+toString:String<br />

name:String<br />

Abbildung 6.4: UML-Klassendiagramm der Beispielanwendung mit EJB-Komponenten<br />

Da von der EJB-Spezifikation [Matena, Hapner 99] verlangt wird, daß jede Entity-Bean einen<br />

Primärschlüssel benötigt, wurde der Entity-Bean WorkBean als Primärschlüssel das Attribut<br />

title hinzugefügt. Das Objektmodell der Beispielanwendung benötigt diesen Primär-


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 48<br />

schlüssel jedoch nicht.<br />

Die Entity Bean WorkBean besitzt daher als Primärschlüssel das Attribut title. Anhand<br />

dieses Attributs wird eine Entity-Bean des Typs WorkBean eindeutig gekennzeichnet, d.h.<br />

es existieren keine zwei Entity-Beans mit demselben title. Da eine Entity-Bean eine objektorientierte<br />

Sicht auf eine Zeile in der Datenbank darstellt, kann es auch keine zwei Zeilen<br />

mit demselben Primärschlüssel title geben.<br />

Durch die Tatsache, daß jeder Entity-Bean vom Typ WorkBean genau ein Objekt vom Typ<br />

ElementaryWork zugeordnet wird und des Primärschlüssels title, erhält man eine Unterteilung<br />

in Themengruppen. Eine Themengruppe wird durch das Attribut title in der<br />

Entity-Bean WorkBean festgelegt. Die Unterteilung in Themengruppen ist keine von der<br />

Applikation geforderte logische Strukturierung, sondern eine technische, um die Granularität<br />

der Beans zu vergröbern.<br />

Jeder Themengruppe können beliebig viele komplexe ElementaryWork-Objekte zugeordnet<br />

werden. Man könnte sich z.B. eine Themengruppe „e-mails“ vorstellen, in der alle verfassten<br />

e-mails abgelegt sind. Um in tiefere Schachtelungsstrukturen (ElementaryWork-<br />

Objekte) vordringen zu können, muß man den Titel einer Themengruppe kennen.<br />

Ein Großteil der Methoden der Klasse ElementaryWork wird in der Entity-Bean angeboten.<br />

Die Implementierung dieser Methoden in der Entity-Bean sieht dabei so aus, daß alle<br />

diese Methodenaufrufe delegiert werden an das der Entity-Bean zugeordnete ElementaryWork-Objekt.<br />

Die Entity-Bean übernimmt in diesem Fall eine Schnittstellen-Funktion für das ElementaryWork-Objekt.<br />

Wie in Kapitel 4 bereits beschrieben wurde, besitzt jede Session- und Entity-Bean ein Homeund<br />

Remote-Interface sowie einen Deployment-Deskriptor.<br />

In Abbildung 6.5 ist das Home-Interface der Entity-Bean WorkBean dargestellt. Wie schon in<br />

Kapitel 4 beschrieben, sind in dem Home-Interface Methoden zum Erzeugen und Auffinden<br />

von Beans vorhanden.<br />

Das Remote-Interface der Entity-Bean ist ein sog. Stellvertreter-Objekt (engl. Proxy-Object).<br />

Für den Client stellt das Stellvertreter-Objekt die Bean dar. Das Remote-Interface bietet alle<br />

Methoden der Bean an, die Clients verwenden dürfen. Abbildung 6.6 zeigt das Remote-<br />

Interface der Entity Bean. In der Abbildung wird deutlich, welche Geschäftsmethoden der<br />

Bean für den Benutzer zur Verfügung stehen. Es stehen Methoden zum Hinzufügen, Modifizieren<br />

und Suchen von ElementaryWork-Objekten zur Verfügung.<br />

Da in dem EJB-Komponentenmodell zahlreiche Eigenschaften der Beans deklarativ im Deployment-Deskriptor<br />

festgelegt werden, hat dieser eine zentrale Bedeutung im EJB-Komponentenmodell<br />

(vergl. Kapitel 4). Der Deployment-Deskriptor der Beispielanwendung ist in<br />

Abbildung 6.7 dargestellt.<br />

Wie in der Abbildung 6.7 dargestellt, wird für alle Methoden des Remote-Interfaces bei jedem<br />

Aufruf ein neuer Transaktions-Kontext erstellt, d.h. jeder Methodenaufruf läuft in einer<br />

eigenen Transaktion. Dieses ist erkennbar an den XML-Tags container-transaction<br />

und method-name.


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 49<br />

import java.rmi.RemteException;<br />

import javax.ejb.*;<br />

public interface WorkHome extends EJBHome<br />

{<br />

public Work create(String title)<br />

throws RemoteException, CreateException ;<br />

}<br />

public Work create(String title,SubjectHeading subjHead, Content cont)<br />

throws RemoteException, CreateException ;<br />

public Work findByPrimaryKey(String pk)<br />

throws FinderException, RemoteException ;<br />

import java.util.Vector;<br />

import java.util.Enumeration;<br />

import javax.ejb.*;<br />

import java.rmi.RemoteException;<br />

Abbildung 6.5: Home-Interface der Entity-Bean<br />

public interface Work extends EJBObject<br />

{<br />

public void print() throws RemoteException;<br />

}<br />

public boolean add(ElementaryWork elementaryWork)<br />

throws RemoteException;<br />

public boolean contains(ElementaryWork elementaryWork)<br />

throws RemoteException;<br />

public boolean alterElement(ElementaryWork elwork)<br />

throws RemoteException;<br />

public Enumeration getAllChildren()<br />

throws RemoteException;<br />

public void setLeaf(boolean b) throws<br />

RemoteException;<br />

public ElementaryWork findSubject(String subj)<br />

throws RemoteException;<br />

public Vector findInAllSubjects(String subj, boolean exactSearch)<br />

throws RemoteException;<br />

Abbildung 6.6: Remote-Interface der Entity-Bean


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 50<br />

Da es sich beim Deployment-Deskriptor um eine einfache Textdatei im XML-Format handelt,<br />

ist es sehr einfach Modifikationen durchzuführen und Informationen aus dem Deployment-Deskriptor<br />

zu extrahieren. Wie in der Abbildung anhand des XML-Tags cmp-field<br />

zu sehen ist, wird das ElementaryWork-Objekt als vom Container zu verwaltendes Feld<br />

deklariert (CMP, container managed persistence). Dies bedeutet, daß der Container zuständig<br />

für die persistente Speicherung dieses Objektes ist.<br />

Die zweite Entity-Bean Komponente in der Beispielanwendung ist die Klasse CompDir, die<br />

in Abbildung 6.8 zu sehen ist. Die Klasse hat, wie bereits beschrieben, die Funktion eines<br />

zentralen Verzeichnisses. Diese Klasse bietet u.a. eine öffentliche Methode add an, mit deren<br />

Hilfe die Bezeichner der in Verbindung stehenden Objekte (SubjectHeading, Content,<br />

ElementaryWork) gespeichert werden.<br />

Intern verwendet die Klasse CompDir eine Hilfs-Klasse Mapper, um die Bindung der beteiligten<br />

Objekte besser speichern und handhaben zu können.<br />

6.2 Beschreibung der Entwicklungs- und Testumgebung<br />

Die EJB-Beispielanwendung wurde zunächst mit Hilfe der J2EE-Referenzimplementierung<br />

in der Version 1.2.1 von [Sun ] entwickelt. Die J2EE-Referenzimplementierung ist ein fertiges<br />

Produkt zum Entwickeln und Testen von EJB-Anwendungen. Dabei handelt es sich<br />

um einen Java EJB Application-Server, der alle vorgeschriebenen Programmierschnittstellen<br />

(APIs) des EJB-Standards enthält. Alle EJB-Applikationen, die entsprechend der EJB-<br />

Spezifikation entwickelt werden, sind auf der Referenzimplementierung lauffähig.<br />

Die Referenzimplementierung wurde von [Sun ] als Vorlage für die Hersteller von EJB Application-Servern<br />

entwickelt.<br />

Bevor eine EJB-Komponente verwendet werden kann, muß diese in den Application-Server,<br />

genauer gesagt im EJB-Container, installiert werden. Da zu einer Bean immer ein Home-<br />

Interface, ein Remote-Interface und ein Deployment-Deskriptor gehören, werden diese nicht<br />

einzeln im EJB-Container installiert, sondern es wird ein sog. JAR-Archiv verwendet. Anschliessend<br />

wird dieses JAR-Archiv mit Hilfe von Import-Werkzeugen des jeweiligen Application-Servers<br />

im EJB-Container installiert. Als persistenter Speicher wurde das relationale<br />

Datenbankmanagement-System von Oracle in der Version 8.1.6 verwendet.<br />

Die Beispielanwendung wurde mit einem J2EE-Installationswerkzeug, dem Deployment-Tool,<br />

im EJB-Container installiert. Das Installationswerkzeug schlug nach Auswahl der vom EJB-<br />

Container persistent zu verwaltenden Entity-Bean Attribute eine passende Tabellenstruktur<br />

vor. Dabei wurden nicht primitive Java-Typen auf binäre SQL-Typen abgebildet. In der Beispielanwendung<br />

muß ein Entity-Bean Attribut vom Typ ElementaryWork auf einen passenden<br />

SQL-Typ abgebildet werden.<br />

Zum Test der Lauffähigkeit der EJB-Komponente wurde ein Java-Programm geschrieben,<br />

welches die Komponenten im EJB-Container lokalisiert und anschließend die Geschäftsme-


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 51<br />

<br />

<br />

<br />

EJB der Beispielanwendung<br />

EJB-WorkBean<br />

<br />

<br />

Die EntityBean WorkBean<br />

WorkBean<br />

WorkBean<br />

WorkHome<br />

Work<br />

WorkBean<br />

Container<br />

java.lang.String<br />

False<br />

<br />

Das zugeordnete ElementaryWork-Objekt<br />

work<br />

<br />

<br />

Die Themengruppe<br />

title<br />

<br />

title<br />

<br />

db<br />

javax.sql.DataSource<br />

Container<br />

<br />

<br />

<br />

<br />

<br />

<br />

WorkBean<br />

*<br />

<br />

Required<br />

<br />

<br />

<br />

Abbildung 6.7: Deployment-Deskriptor der Beispielanwendung


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 52<br />

import java.util.*;<br />

public class CompDir {<br />

private static Vector mappedComponents = new Vector();<br />

public CompDir() {}<br />

public static void add(String subject, String title, String content) {<br />

mappedComponents.add(new Mapper(subject,title,content));<br />

}<br />

public static Vector getAllElemWorksRefBySubj(String subj) {<br />

Vector v = new Vector();<br />

Enumeration iter = mappedComponents.elements();<br />

while (iter.hasMoreElements()) {<br />

Mapper map = (Mapper)iter.nextElement();<br />

if (map.getSubjectHeading().equals(subj))<br />

v.add(map.getElementaryWork());<br />

}<br />

return v;<br />

}<br />

public static void printAllEntries() {<br />

...<br />

}<br />

public static int size() {<br />

...<br />

}<br />

} // CompDir<br />

class Mapper {<br />

private String subjectHeading;<br />

private String elementaryWork;<br />

private String content;<br />

public Mapper(String subject, String elWork, String content) {<br />

this.subjectHeading = subject;<br />

this.elementaryWork = elWork;<br />

this.content = content;<br />

}<br />

public String getSubjectHeading() {return subjectHeading;}<br />

public void setSubjectHeading(String v) {this.subjectHeading = v;}<br />

public String getElementaryWork() {return elementaryWork;}<br />

public void setElementaryWork(String v) {this.elementaryWork = v;}<br />

public String getContent() {return content;}<br />

public void setContent(String v) {this.content = v;}<br />

}//Mapper<br />

Abbildung 6.8: Zentrale Verzeichnis-Klasse


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 53<br />

thoden aufruft. Ein Ausschnitt des Java-Programms ist in Abbildung 6.9 dargestellt.<br />

Als nächter Schritt muß die Beispielanwendung in den verschiedenen Application-Servern<br />

installiert werden. Auf der Grundlage festgelegter Kriterien werden die Ergebnisse miteinander<br />

verglichen.<br />

In diesem Kapitel wurde bisher eine Beispielanwendung auf Basis von EJB-Komponenten,<br />

eine Java-Anwendung zum Testen der EJB-Komponenten sowie die Testumgebung, in der<br />

die Anwendung entwickelt und getestet werden soll, vorgestellt. In dem nun folgenden Abschnitt<br />

werden die Vergleichs-Kriterien vorgestellt.<br />

6.3 Vorstellung der Vergleichskriterien<br />

In den vorigen Abschnitten dieses Kapitels wurde eine EJB-Beispielanwendung vorgestellt<br />

und beschrieben. In diesem Abschnitt werden Kriterien vorgestellt, anhand derer ein Vergleich<br />

zwischen den verschiedenen Application-Servern durchgeführt wird.<br />

Installierbarkeit der EJB-Komponenten<br />

Bei diesem Kriterium wird geprüft, ob die EJB-Komponenten ohne Modifikation auf allen<br />

untersuchten Application-Servern installierbar sind. Das schließt auch die Behandlung des<br />

Deployment-Deskriptors mit ein.<br />

Struktur der vom EJB-Container erzeugten Tabelle<br />

Falls der EJB-Server die automatische Generierung von Tabellenstrukturen für die EJBs<br />

anbietet, wird die generierte Tabellenstruktur untersucht.<br />

Wichtig im Zusammenhang mit komplexen Attribut-Typen von Entity-Beans, die persistent<br />

gespeichert werden müssen, ist die vom Container erzeugte Tabellenstruktur. Hierbei ist die<br />

Abbildung zwischen nicht primitiven Java Datentypen und den in der Datenbank angebotenen<br />

Datentypen besonders wichtig.<br />

Art und Umfang notwendiger Modifizierungen<br />

Im Falle von notwendigen Modifizierungen an der Beispielanwendung, wird geprüft welche<br />

Art von Änderungen durchgeführt werden müssen. Zusätzlich wird geprüft, wie Umfangreich<br />

die Änderungen sind.<br />

Lauffähigkeit der EJB-Komponenten<br />

Hierbei werden mit Hilfe einer Java Konsolen-Anwendung die einzelnen Komponenten


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 54<br />

import java.util.*;<br />

import javax.naming.Context;<br />

import javax.naming.InitialContext;<br />

import javax.rmi.PortableRemoteObject;<br />

public class ElemWorkClient {<br />

public static void main(String[] args) {<br />

WorkHome elworkHome = null;<br />

Work elemwork = null;<br />

try {<br />

Context initial = new InitialContext();<br />

Object objref = initial.lookup("dipl2009");<br />

elworkHome = (WorkHome)PortableRemoteObject.narrow(objref,<br />

WorkHome.class);<br />

...<br />

ElementaryWork elwork = new ElementaryWork("ElWork1",<br />

new SubjectHeading("subject1"),<br />

new Content("content1"));<br />

ElementaryWork elwork2 = new ElementaryWork(elwork,"ElWork2",<br />

new SubjectHeading("subject2"),<br />

new Content("content2"));<br />

CompDir.printAllEntries();<br />

ElementaryWork finalWrk = new ElementaryWork("FinalElWork");<br />

ElementaryWork f1 = finalWrk;<br />

ElementaryWork fnl = f1;<br />

String startTxt = "FinalElWork";<br />

long start = 0, stop = 0;<br />

start = System.currentTimeMillis();<br />

for (int i=0;i


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 55<br />

der EJB Anwendung getestet. Es werden mehrere Tests der Komponenten durchgeführt, unter<br />

anderem wird das Erstellen und Entfernen von WorkBean-Objekten, das Erstellen von<br />

komplexen ElementaryWork-Objekten im EJB-Container sowie auf Client-Seite getestet.<br />

Umsetzung des Rollenkonzepts<br />

Bei diesem Kriterium wird bei jedem hier betrachteten Application-Server geprüft, inwieweit<br />

das durch die EJB-Spezifikation [Matena, Hapner 99] eingeführte Rollenkonzept<br />

umgesetzt wurde.<br />

In den folgenden Unterabschnitten werden die verschiedenen Application-Server anhand<br />

der hier aufgeführten Kriterien miteinander verglichen.<br />

6.4 BEA WebLogic Application-Server<br />

Beim BEA WebLogic Application-Server handelt es sich um ein Produkt der Firma [BEA b].<br />

Der Bea Application-Server in der Version 5.1 ist überwiegend kommandozeilenorientiert,<br />

d.h. viele Funktionen zum Installieren, Überwachen und Kompilieren von EJB-Komponenten<br />

sind nur mit Hilfe von Befehlen auf der Kommandozeile durchzuführen. Es existiert zwar<br />

ein graphisches Überwachungswerkzeug für den Application-Server. Mit Hilfe dieser sog.<br />

Konsole können einige Parameter des Application-Servers verändert werden.<br />

Zusätzlich gibt es die Möglichkeit, über HTML einige Parameter des Application-Servers zu<br />

konfigurieren.<br />

Für die Installation von EJB-Komponenten im Container gibt es eine einfache Java-Anwendung<br />

mit graphischer Oberfläche.<br />

Für die Entwicklung von EJB-Komponenten liefert BEA keine eigene Java Entwicklungsumgebung,<br />

sondern bietet sog. Plug-Ins für existierende Java Entwicklungsumgebungen an.<br />

Die Kommunikation zwischen Clients und den EJB-Komponenten findet bei BEA hauptsächlich<br />

mit Hilfe des BEA-eigenen t3-Protokolles statt.<br />

6.4.1 Installation der EJB-Beispielanwendung<br />

Die Werkzeuge für die Generierung der Anwendungslogik des Objekt-Relationalen Mappings<br />

waren auf Anhieb nicht in der Lage, das ElementaryWork-Objekt auf einen passenden<br />

Datentyp in der Datenbank abzubilden. Dieser Fehler wird nicht bei der Generierung<br />

der notwendigen SQL-Anweisungen erkannt, sondern erst zur Laufzeit. Die Fehlermeldung<br />

lautet in diesem Fall Ungültiger Spaltentyp. Die Referenzimplementierung von [Sun ] hatte<br />

mit diesem komplexen Java-Typ keine Schwierigkeiten. Das Installationswerkzeug der Referenzimplementierung<br />

wählte als passenden Datentyp in der Datenbank einen Binär-Typ.<br />

Das Installationswerkzeug des BEA Application-Servers bietet auch keine Möglichkeit, die<br />

Tabellenstruktur automatisch generieren zu lassen. So muß die Tabellenstruktur vor der Installation<br />

der EJB-Komponenten bekannt und vorhanden sein. Erst danach kann der Installierer<br />

der EJB-Komponente, was in der EJB-Spezifikation der Rolle des Deployers entspricht,


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 56<br />

die Installation der Komponenten durchführen. Dabei muß der Installierer eine Zuordnung<br />

zwischen den Spaltennamen und den persistent zu speichernden EJB-Attributen vornehmen.<br />

6.4.2 Test der EJB-Komponente<br />

Die Lauffähigkeit der EJB-Komponenten wird anhand einer Java-Anwendung überprüft. Da<br />

nicht erkennbar war, welcher Datentyp in der Datenbank bei der Abbildung des ElementaryWork-Attributes<br />

vom Installationswerkzeug gewählt wurde, konnte der Test zunächst<br />

nicht durchgeführt werden.<br />

Um den Test dennoch in geringerem Umfang durchführen zu können, mußte das betroffene<br />

Attribut der Entity Bean als „nicht vom EJB-Container zu verwaltendes Feld“ deklariert<br />

werden. Nach dieser Änderung lief der Test problemlos, da vom EJB-Container nur primitive<br />

Java-Typen auf die Datenbank abgebildet werden mußten.<br />

Wichtig in diesem Zusammenhang ist jedoch, daß keine Änderungen an der Bean durchgeführt<br />

wurden, sondern mit Hilfe der Werkzeuge des EJB-Containers lediglich der Deployment-Deskriptor<br />

modifiziert wurde.<br />

6.4.3 Umsetzung des EJB-Rollenkonzepts<br />

Das Rollenkonzept wird bei [BEA b] für jede Rolle eingeführt. Die Rolle des System-Administrators,<br />

Application-Assemblers des Deployers (Installierer) sowie des Bean-Entwicklers<br />

ist klar erkennbar.<br />

Ein Grund für das Fehlen von Funktionen zum Hinzufügen und Entfernen von EJB-Komponenten<br />

in der Konsole ist die Einhaltung des Rollenkonzeptes. Dies verhindert Überschneidungen<br />

in den Aufgabenbereichen zwischen der Rolle des System-Administrators und der<br />

Rolle des Installierers.<br />

So ist es dem Installierer möglich mit Hilfe vo Installationswerkzeugen des EJB-Containers<br />

EJB-Komponenten zu installieren oder zu entfernen, ohne das selbe Werkzeug des System-<br />

Administrators zu benutzen. Da zu den Aufgaben der System-Administratoren auch die<br />

Administration des EJB-Servers und EJB-Containers zählt, wären bei gemeinsamer Benutzung<br />

des Administrations-Werkzeugs Fehlbedienungen nicht ausgeschlossen.<br />

6.5 SilverStream Application-Server<br />

Der Silverstream Application-Server der Firma [Silverstream ] in der Version 3.7 besitzt<br />

zwei graphische Werkzeuge: die Manager-Konsole und den Designer, mit deren Hilfe der<br />

Application-Server konfiguriert werden kann und Anwendungen für den Application-Server<br />

entwickelt werden können. Der Designer stellt eine Applikation dar, in der mehrere Funktionen<br />

vereint sind: Entwicklungsumgebung, Oberflächengestaltung (GUI-Erstellung) sowie<br />

Installationswerkzeug für die EJB-Komponenten.


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 57<br />

Die Manager-Konsole integriert zahlreiche Funktionen zum Starten, Beenden und Konfigurieren<br />

des Application-Servers.<br />

Im Designer sind mehrere Formular-Designer vorhanden, mit denen HTML- sowie Javabasierte<br />

Clients für die EJBs auf Basis eines silverstreameigenen Rahmenwerkes erstellt werden<br />

können.<br />

Im SilverStream Application-Server ist ein EJB-Installations-Assistent für verschiedene Java-<br />

Entwicklungsumgebungen vorhanden, wie z.B. Borland JBuilder und Visual Cafe. Mit dessen<br />

Hilfe ist der Bean-Entwickler in der Lage, aus einer vom Application-Server unterstützten<br />

Entwicklungsumgebung EJB-Komponenten in den Application-Server, genauer gesagt<br />

im EJB-Container, zu installieren.<br />

Im SilverStream Application-Server ist eine Java Entwicklungsumgebung integriert, so daß<br />

eine Anwendungsentwicklung nur mit Hilfe der Management-Konsole sowie des Designers<br />

möglich ist.<br />

Beim SilverStream Application-Server müssen die EJB-Komponenten sowie der Deployment-<br />

Deskriptor immer zuerst in einem Repository des Application-Servers installiert werden. Dieses<br />

Repository wird in einer Datenbank abgelegt. Anschliessend muß mit mehreren Assistenten,<br />

wie z.B. Jar-, EJB-Jar, Tabellen-, Formular- oder Deployment-Assistent die EJB-<br />

Komponente im EJB-Container installiert werden.<br />

6.5.1 Installation der EJB-Beispielanwendung<br />

Der erste Versuch, die EJB-Komponenten der Beispielanwendung in dem Application-Server<br />

zu installieren, schlug fehl, weil beim SilverStream Application-Server alle EJB-Komponenten<br />

in einem Java-Package abgelegt sein müssen. Dies hatte zur Folge, dass der Programmcode<br />

der EJB-Komponenten geändert werden mußte. Diese Einschränkung ist auch nicht in der<br />

EJB-Spezifikation aufgeführt.<br />

Es ist allerdings in der Programmiersprache Java gängige Praxis, zusammengehörige Klassen<br />

in einem gemeinsamen Package abzulegen. Daher sollte die Änderung der EJB-Komponenten<br />

in diesem Fall vernachlässigt werden.<br />

Die Klassen der Beispielanwendung wurden anschliessend in einem Java-Package abgelegt<br />

und erfolgreich in dem EJB-Container installiert.<br />

6.5.2 Test der EJB-Komponenten<br />

Die im SilverStream Application-Server installierten EJB-Komponenten wurden durch eine<br />

Java-Anwendung auf ihre Lauffähigkeit getestet. Die EJB-Komponenten konnten im EJB-<br />

Container lokalisiert und verwendet werden.


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 58<br />

6.5.3 Umsetzung des EJB-Rollenkonzepts<br />

Beim SilverStream Application-Server sind zwei große Rollen erkennbar: die Rolle des Bean-<br />

Entwicklers und die Rolle des Administrators.<br />

Diese Rollenunterteilung wird auch in den zur Verfügung stehenden Werkzeugen deutlich:<br />

die Manager-Konsole sowie der Designer. In der Manager-Konsole sind die Funktionen<br />

zum Konfigurieren sowie Starten und Herunterfahren des Application-Servers enthalten.<br />

Die Manager-Konsole ist ein typisches Werkzeug für die Rolle des System-Administrators.<br />

Der Designer ist ein Werkzeug, in dem zahlreiche weitere Werkzeuge zusammengefasst<br />

sind, wie z.B. Formular-Assistent, Jar-Assistent oder Tabellen-Assistent. Jedes dieser Werkzeuge<br />

ist graphisch aufwendig gestaltet und bietet einen hohen Bedienkomfort. Das von der<br />

EJB-Spezifikation eingeführte Rollenkonzept für die bessere Aufteilung von Zuständigkeiten<br />

und einfachere Entwicklung von EJB-Komponenten wird hierdurch jedoch nicht eingehalten.<br />

So sind im Designer die Rolle des Application-Assemblers, Installierers und des Bean-Entwicklers<br />

vereint.<br />

Für die schnelle Anwendungsentwicklung ist diese Zusammenfassung von mehreren Rollen<br />

vorteilhaft, für die Administration jedoch nachteilig. Speziell der Übergang einer Anwendung<br />

aus der Testumgebung in die Produktionsumgebung wird durch fehlende Rollenverteilung<br />

erschwert.<br />

6.6 Borland Application-Server<br />

Der Borland Application-Server der Firma [Borland ] in der Version 4.1 ist ebenfalls wie der<br />

SilverStream Application-Server graphisch-orientiert. Es existiert eine Management-Konsole<br />

mit zahlreichen integrierten Funktionen.<br />

In dieser Management-Konsole sind Funktionen zum Starten, Herunterfahren Konfigurieren<br />

des Application-Servers sowie Funktionen zum Installieren und Entfernen von EJB-<br />

Komponenten vorhanden.<br />

Der Borland Application-Server besitzt keine integrierte Java Entwicklungsumgebung wie<br />

der SilverStream Application-Server, da Borland eine eigenständige Java Entwicklungsumgebung<br />

besitzt, und zwar den Borland JBuilder. Diese Entwicklungsumgebung besitzt Funktionen<br />

zum Installieren, Testen und Entwickeln von EJB-Komponenten.<br />

Seit der Version 4.5 ist dieses Produkt J2EE zertifiziert. Es besitzt als integrierten ORB (Object<br />

Request Broker) den ebenfalls von Borland entwickelten VisiBroker, der in der Praxis<br />

seit längerem eingesetzt wird.


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 59<br />

6.6.1 Installation der EJB-Beispielanwendung<br />

Das Installieren von Komponenten in den Borland Application-Server kann entweder mit<br />

Hilfe der Management-Konsole oder aber aus einer Java Entwicklungsumgebung, z.B. JBuilder,<br />

durchgeführt werden. Die Management-Konsole bietet zahlreiche Hilfsfunktionen, wie<br />

z.B. die automatische Generierung des herstellerabhängigen Deployment-Deskriptors für<br />

den Borland Application-Server. Dieser Schritt ist nötig, weil jeder Hersteller seine eigenen,<br />

herstellerspezifischen Einstellungen in einem zweiten Deployment-Deskriptor ablegt.<br />

Aufgrund dieser Tatsache wird beim Versuch, eine EJB-Komponente eines anderen Herstellers<br />

zu installieren, ein Fehler angezeigt. Anschliessend muß der Deployment-Deskriptor<br />

einmal mit dem ebenfalls im Borland Application-Server integrierten Deployment-Deskriptor<br />

Editor geöffnet und ohne Modifikation wieder abgespeichert werden, damit die borlandspezifischen<br />

XML-Informationen in den Deployment-Deskriptor abgelegt werden. Erst nach<br />

diesem Schritt können die Komponenten in den EJB-Server installiert werden.<br />

Die Installation verlief ohne Probleme. Die Objekt-Relationale Abbildung zwischen den vom<br />

EJB-Container persistent zu speichernden Attributen in der Entity-Bean und der Datenbank<br />

verlief ebenfalls ohne Probleme.<br />

Die Tabellen für die Entity-Beans müssen manuell erstellt werden. Der Bean-Installierer muß<br />

den Namen der Tabelle angeben sowie eine Zuordnung der vom EJB-Container persistent<br />

zu speichernden Attribute und den Tabellenattributen vornehmen.<br />

Für das in der Beispielanwendung existierende Entity-Bean Attribut vom Typ Elementary-<br />

Work wurde in der Tabellendefinition ein binärer Datentyp in der Datenbank ausgewählt.<br />

6.6.2 Test der EJB-Komponente<br />

Für den Test der EJB-Komponenten wird eine einfache Client-Anwendung verwendet. Diese<br />

benötigt ein Jar-Archiv, in dem sich das Home- und das Remote-Interface befinden. Zusätzlich<br />

werden mit Hilfe von EJB-Server-Tools Client- und Server-Stubs generiert, mit Hilfe<br />

derer der Client mit dem EJB-Server kommuniziert.<br />

Die Client-Anwendung ruft bei einer Kommunikation zunächst eine Methode des Home-<br />

Interfaces auf, um ein Exemplar einer Bean zu erzeugen.<br />

Mit Hilfe dieser Java-Anwendung konnten die Beans in dem EJB-Container lokalisiert und<br />

verwendet werden.<br />

Der Test der EJB-Komponenten verlief ohne Probleme. Die EJB-Komponenten konnten lokalisiert<br />

und verwendet werden.<br />

6.6.3 Umsetzung des EJB-Rollenkonzepts<br />

Das Rollenkonzept wird beim Borland Application-Server, ähnlich wie beim SilverStream<br />

Application-Server, nur teilweise umgesetzt. So sind in der Manager-Konsole mehrere Rollen<br />

wiederzufinden: die Rolle des System-Administrators, die Rolle des Bean-Entwicklers<br />

sowie die Rolle des Installierers und des Application-Assemblers.<br />

Fast alle Rollen sind in diesem einzigen Werkzeug zusammengefasst.


KAPITEL 6. INSTALLATION EINER BEISPIELANWENDUNG IN EJB-SERVERN 60<br />

6.7 Auswertung der Vergleichskriterien<br />

Die in diesem Kapitel betrachteten Application-Server stellen einen kleinen Ausschnitt aus<br />

den verfügbaren EJB Application-Servern dar. Obwohl alle Hersteller die Spezifikation einhalten,<br />

gibt es Bereiche, in denen sie einen bestimmten Freiraum haben, die Anforderungen<br />

der Spezifikation umzusetzen.<br />

Genau an diesen Stellen sind die Hauptunterschiede zwischen den verschiedenen Herstellern<br />

zu sehen.<br />

Die Einführung einer Pakethierarchie, die vom SilverStream Application-Server verlangt<br />

wird, kann einen großen Aufwand bei der nachträglichen Einführung einer Pakethierarchie<br />

bedeuten, wenn zahlreiche Klassen vorhanden sind.<br />

In der Programmierpraxis werden Pakethierarchien jedoch sehr häufig eingesetzt.<br />

Trotz der EJB-Spezifikation gibt es immer wieder Hindernisse bei der Portabiliät von EJB-<br />

Komponenten. Als Konsequenz wird man sich für einen Hersteller entscheiden und Kompromisse<br />

bei der Portabilität eingehen müssen.<br />

In der Tabelle 6.1 ist die Auswertung der Vergleichskriterien nochmal tabellarisch aufgeführt.<br />

In der Abbildung sind die einzelnen Kriterien sowie der jeweilige Erfüllungsgrad der<br />

betrachteten Application-Server aufgeführt. Mit „SUN RI J2EE 1.2.1“ in Tabelle 6.1 ist die<br />

J2EE-Referenzimplementierung von [Sun ] gemeint.<br />

Vergleichskriterium SUN RI J2EE 1.2.1 BEA 5.1 SilverStream 3.7 Borland 4.1<br />

Installierbarkeit ja ja ja ja<br />

der EJB-Komponenten<br />

Automatische ja nein nein nein<br />

Tabellengenerierung<br />

durch Container<br />

Umfang notwendiger keine gering gering keine<br />

Modifizierungen<br />

Lauffähigkeit der ja ja ja ja<br />

EJB-Komponenten<br />

Umsetzungsgrad des mittel hoch niedrig niedrig<br />

EJB-Rollenkonzepts<br />

Tabelle 6.1: Auswertung der Vergleichskriterien<br />

In diesem Kapitel wurde eine Beispielanwendung vorgestellt und in eine auf EJB-Komponenten<br />

basierte Anwendung überführt. Anschliessend ist diese Beispielanwendung in verschiedenen<br />

EJB-Servern installiert worden. In den folgendem Kapitel werden nun die Probleme<br />

beschrieben, die bei der Abbildung eines Objekt-Modells auf ein EJB-Modell entstehen<br />

können.


Kapitel 7<br />

Abbildung eines Objekt-Modells auf<br />

ein EJB-Modell<br />

In diesem Kapitel werden die Probleme aufgeführt, die bei der Abbildung eines objektorientierten<br />

Modells auf EJB-Komponenten entstehen können. Es werden dabei zwei mögliche<br />

Lösungen vorgestellt und miteinander verglichen.<br />

In Abschnitt 7.1 werden zunächst die generellen Probleme aufgeführt, die bei der Abbildung<br />

eines objektorientierten Modells auf EJB-Komponenten entstehen können. Abschnitt<br />

7.2 beschreibt die auf künstlichen Primärschlüssel basierende Lösung, während Abschnitt<br />

7.3 die auf Java-Objektidentität basierende Lösung beschreibt. In Abschnitt 7.4 werden zum<br />

Abschluß dieses Kapitels die in vorgestellten Lösungsansätze miteinander verglichen.<br />

In diesem Kapitel meint der Begriff „EJB-Anwendung“ immer Java-Anwendungen, die Entity-Beans<br />

als EJB-Komponenten einsetzen. Der Begriff Abbildung bezeichnet alle notwendigen<br />

Schritte zur Implementierung einer auf EJB-Komponenten basierenden Java-Anwendung<br />

ausgehend von einem objektorientierten Modell.<br />

7.1 Generelle Abbildungsprobleme<br />

Bei der direkten Abbildung eines Objektmodells auf ein EJB-Modell entstehen i.A. zahlreiche<br />

Entity-Beans. Jede Entity-Bean besteht aus dem Home- und Remote-interface sowie aus<br />

dem Primärschlüssel. Für die Verwaltung dieser Bestandteile einer Entity-Bean ist der EJB-<br />

Container zuständig, was bei zahlreichen Entity-Beans zu Laufzeitproblemen führen kann.<br />

Die Anwendungen werden „relational gedacht“, da zum Erzeugen und Auffinden von Entity-Beans<br />

die Primärschlüssel verwendet werden müssen. Auch das Setzen von Beziehungen<br />

zwischen Entity-Beans geschieht mit Hilfe der Primärschlüssel. Die EJB-Anwendungen<br />

erscheinen letztendlich als eine „objektorientierte Verpackung“ von relationalen Datenbankstrukturen.<br />

Das folgende Beispiel verdeutlicht diese Sichtweise:<br />

...<br />

Cabin cabin1 = home.create(1);<br />

cabin1.setName("Master Suite");<br />

61


KAPITEL 7. ABBILDUNG EINES OBJEKT-MODELLS AUF EIN EJB-MODELL 62<br />

cabin1.setDeckLevel(1);<br />

cabin1.setBedCount(3);<br />

//Setzen der Beziehungen zwischen Cabin und Ship<br />

Ship ship = shipHome.create(1);<br />

cabin1.setShip(1);<br />

CabinPK pk = new CabinPK();<br />

pk.id = 1;<br />

Cabin cabin2 = home.findByPrimaryKey(pk);<br />

...<br />

Es wird eine Entity-Bean vom Typ Cabin angelegt, die anhand einer Nummer identifiziert<br />

wird. Ebenfalls aus dem Beispiel ersichtlich ist der Einsatz von Fremdschlüsseln in der EJB-<br />

Anwendung. Durch die Anweisung cabin1.setShip(1) wird über eine assoziative Identifikation<br />

(vergl. [Schmidt, Matthes 98]) mit Hilfe des Fremdschlüssels eine Beziehung zu<br />

einem Objekt vom Typ Ship mit dem Primärschlüsselwert 1 hergestellt.<br />

In objektorientierten Anwendungen werden Beziehungen zwischen Objekten durch direkte<br />

Referenzen ausgedrückt. In dem folgenden Beispiel ist das eben gezeigte EJB-Beispiel in<br />

objektorientiertem Programmierstil dargestellt:<br />

...<br />

Cabin cabin1 = new Cabin();<br />

cabin1.setName("Master Suite");<br />

cabin1.setDeckLevel(1);<br />

cabin1.setBedCount(3);<br />

//Setzen der Beziehungen zwischen Cabin und Ship<br />

Ship ship = new Ship("Traumschiff");<br />

cabin1.setShip(ship);<br />

...<br />

Wie aus diesem direkten Vergleich ersichtlich ist, unterscheiden sich EJB-Anwendungen<br />

von „normalen“ Java-Anwendungen in der Referenzierung von EJB-Komponenten. In EJB-<br />

Anwendungen werden Entity-Beans immer über einen Primärschlüssel referenziert. Im Falle<br />

eines komplexen Primärschlüssels, der sich z.B. aus mehreren Attributen der Entity-Bean<br />

zusammensetzt, wird eine separate PrimaryKey Klasse benötigt (vergl. Kapitel 4).<br />

In der Beispielanwendung aus Kapitel 6 wurde versucht, die Modifikationen an der Anwendung<br />

so gering wie möglich zu halten, um eine EJB-Anwendung zu erhalten. Daher wurde<br />

die Entity-Bean WorkBean so entworfen, daß alle relevanten Geschäftsmethoden der Klasse<br />

ElementaryWork auch in der Entity-Bean angeboten werden.<br />

Die Entity-Bean hat dann neben der automatischen persistenten Speicherung die Aufgabe<br />

einer Schnittstelle für die ElementaryWork-Klasse. Die Entity-Bean delegiert alle Aufrufe<br />

der Geschäftsmethoden weiter an ein ihr zugeordnetes ElementaryWork-Objekt.<br />

In [Alur et al. 01] wird betont, daß es nicht sinvoll ist, jedes persistent zu speichernde Objekt<br />

einer Anwendung als Entity-Bean zu realisieren, da dies i.A. zu Lasten der Performanz der<br />

Anwendung geht. Viel wichtiger sei die Entscheidung, ob feingranulare oder grobgranulare<br />

Entity-Beans eingesetzt werden sollten.


KAPITEL 7. ABBILDUNG EINES OBJEKT-MODELLS AUF EIN EJB-MODELL 63<br />

Feingranulare EJB-Komponenten enthalten für jedes Attribut jeweils eine Methode zum<br />

Auslesen (engl. accessor) und eine Methode zur Manipulation (engl. mutator). Dies hat zur<br />

Folge, daß mehrere Methodenaufrufe notwendig sind, um den Zustand aller Attribute Auszulesen.<br />

Das gleiche gilt für die Manipulation von Attributen.<br />

Grobgranulare EJB-Komponenten fassen i.A. logisch zusammengehörige Attribute zu größeren<br />

Strukturen zusammen. Dies geschieht meistens mit Hilfe von abhängigen Objekten<br />

(engl. dependent objects).<br />

Bei der direkten Abbildung eines objektorientierten Modells auf ein EJB-Modell entstehen<br />

häufig feingranulare EJB-Komponenten.<br />

Ein weiteres Problem bei feingranularen Entity-Beans entsteht durch die Beziehungen zwischen<br />

den Entity-Beans. Da Referenzen zwischen Entity-Beans mit Hilfe der Home- oder<br />

Remote-Interfaces bzw. der Primärschlüssel aufgebaut werden, müssen die Referenzen auf<br />

andere EJB-Komponenten einer Entity-Bean geändert werden, sobald sich an den referenzierten<br />

EJB-Komponenten etwas ändert. Ein Beispiel für eine Änderung wäre z.B. das Löschen<br />

einer Entity-Bean. Auch müssen diese Beziehungen i.A. dynamisch mit Hilfe der<br />

Home- oder Remote-Interfaces bzw. den Primärschlüsseln neu aufgebaut werden.<br />

Dies bedeutet eine Zunahme der Komplexität des Programmcodes in den Entity-Beans aufgrund<br />

der zusätzlichen Pflege von Referenzen. Die Ursache hierfür liegt in der Tatsache, daß<br />

die Gültigkeit der Referenzen zwischen Entity-Beans nicht garantiert werden kann (vergl.<br />

[Alur et al. 01]).<br />

Ein weiteres Problem mit feingranularen Entity-Beans ist ihre Abhängigkeit vom Datenbankschema,<br />

da feingranulare Entity-Beans i.A. eine Zeile in einer Datenbanktabelle repräsentieren.<br />

Dies bedeutet wiederum, daß feingranulare Entity-Beans eine direkte Repräsentation<br />

des Datenbankschemas darstellen. Jede Schemaänderung hat auch eine Änderung der<br />

feingranularen Entity-Bean zur Folge, was wiederum auch Änderungen an den Programmen<br />

bedeutet, die diese Entity-Beans verwenden. Der Aufrufer der Bean und die Bean selber<br />

befinden sich auf der selben Granularitätsstufe. Es existiert also eine enge Abhängigkeit<br />

zwischen feingranularen EJB-Komponenten, dem Datenbankschema sowie den Anwendungen,<br />

die die EJB-Komponenten verwenden.<br />

Bei der Wahl der passenden feingranularen oder grobgranularen Entity-Bean sollte das Transaktionale<br />

Verhalten der EJB-Komponente ebenfalls berücksichtigt werden. Ein Benutzer einer<br />

Entity-Bean hat nur für die Dauer eines Methodenaufrufs exklusiven Zugriff auf die<br />

Bean. Alle anderen Benutzer müssen solange warten, bis der Aufruf beendet ist. Diese Aufruf<br />

kann in einem Transaktionskontext ablaufen. Wenn zu viel Logik in einer Methode implementiert<br />

wird, so kann dies zu langen Antwortzeiten bzw. Wartezeiten für die anderen<br />

Benutzer führen.<br />

Wie in [Holland 01] beschrieben, ist in der EJB-Spezifikation 1.1 (vergl. [Matena, Hapner 99])<br />

keine Unterstützung für Beziehungen zwischen Entity-Beans vorhanden. Weiterhin wird beschrieben,<br />

daß der Zustand aller Attribute einer Entity-Bean, die nicht vom EJB-Container<br />

persistent gespeichert werden sollen, sich jederzeit ändern kann.<br />

Die Ursache hierfür liegt in den Lebenszyklen der Beans sowie in der Funktion der Entity-<br />

Beans: die Repräsentation von persistent gespeicherten Daten.<br />

Eine Bean kann sich, wie in [Matena, Hapner 99] und [DeMichiel et al. 00] beschrieben,<br />

in verschiedenen Zuständen befinden. Bei dem Wechsel von dem Zustand „Ready“ in den


KAPITEL 7. ABBILDUNG EINES OBJEKT-MODELLS AUF EIN EJB-MODELL 64<br />

Zustand „Pooled“, was einer Passivierung der Bean entspricht, und umgekehrt, was einer<br />

Aktivierung der Bean entspricht, können Attribute, die nicht persistent gespeichert werden<br />

sollen, ihren Zustand verlieren.<br />

In [Holland 01] wird ein Verfahren vorgestellt, mit dem man komplexe Beziehungen zwischen<br />

Entity-Beans realisieren kann. Das Verfahren beruht im wesentlichen auf die sog.<br />

callback-Methoden der EJB-Komponenten, die der Container bei bestimmten Zustandsänderungen<br />

der Bean aufruft. Auf die callback-Methoden wird hier nicht näher eingegangen.<br />

Eine ausführliche Behandlung findet sich z.B. in [Matena, Hapner 99], [Monson-Haefel 00]<br />

oder [Roman 99].<br />

Das in [Holland 01] beschriebene Verfahren extrahiert mit Hilfe der Methode getPrimaryKey()<br />

des remote-Interfaces den jeweiligen Primärschlüssel und speichert diesen in ein<br />

vom EJB-Container persistent zu speicherndes Attribut. Da der EJB-Container selbst über<br />

dieses zusätzliche Feld keine weiteren Informationen besitzt, müs der Bean-Entwickler in<br />

bestimmten Callback-Methoden die Extrahierung des Primärschlüssels bzw. die Erzeugung<br />

einer Entity-Bean Referenz aus dem Primärschlüssel sowie die persistente Speicherung implementieren.<br />

Der Aufbau von komplexen Beziehungen zwischen Entity-Beans ist nicht so einfach wie<br />

beim Aufbau von Beziehungen zwischen „normalen“ Objekten (vergl. [Holland 01]). Die<br />

Ursache hierfür liegt darin, daß die persistent zu speichernden Attribute von Entity-Beans<br />

darauf ausgelegt sind, Daten zu halten, die einem Feld in einer relationalen Datenbank oder<br />

einem anderen persistenten Datenspeicher. In den meisten Fällen enthalten die persistenten<br />

Attribute der Entity-Beans Datentypen, die einen entsprechenden Typ in der Datenbank besitzen.<br />

Für den Typ „Objekt-Referenz“ gibt es in der Regel aber keinen passenden Typ in der Datenbank.<br />

Wie man anhand der in diesem Abschnitt beschriebenen Probleme sehen kann, sind mehrere<br />

Faktoren bei der Abbildung eines Objektmodells auf ein EJB-Modell zu berücksichtigen.<br />

Diese Tatsache erschwert die Entwicklung von EJB-Anwendungen, da zahlreiche Faktoren<br />

berücksichtigt werden müssen.<br />

7.2 EJB-Komponenten basierend auf künstlichen Primärschlüssel<br />

Da die EJB-Spezifikation für Entity-Beans einen Primärschlüssel bzw. eine Primärschlüsselklasse<br />

vorschreibt, entstehen hierdurch EJB-Anwendungen, die stark abhängig von Primärschlüsseln<br />

sind. Dieser Effekt wird durch den Aufbau von Beziehungen zwischen Entity-<br />

Beans noch verstärkt, da hier auch Fremdschlüssel betrachtet werden müssen. Hierdurch<br />

werden relationale Strukturen in die EJB-Anwendung integriert. Dies hat zur Folge, daß<br />

man in einer EJB-Anwendung nach zwei Paradigmen entwickelt, das objektorientierte Paradigma<br />

und das relationale Paradigma.<br />

Das folgende Beispiel zeigt, wie der Einsatz eines Primärschlüssels und Fremdschlüssels die<br />

Anwendung beeinflusst:<br />

...<br />

Cabin cabin1 = home.create(1);<br />

cabin1.setName("Master Suite");


KAPITEL 7. ABBILDUNG EINES OBJEKT-MODELLS AUF EIN EJB-MODELL 65<br />

cabin1.setDeckLevel(1);<br />

cabin1.setBedCount(3);<br />

//Setzen der Beziehungen zwischen Cabin und Ship<br />

Ship ship = shipHome.create(1);<br />

cabin1.setShip(1);<br />

CabinPK pk = new CabinPK();<br />

pk.id = 1;<br />

Cabin cabin2 = home.findByPrimaryKey(pk);<br />

...<br />

Da die meisten verfügbaren Datenbanksysteme häufig Optimierungen für numerische oder<br />

alphanumerische Primärschlüssel besitzen, ist es sinnvoll einen numerischen oder alphanumerischen<br />

Datentyp für einen Primärschlüssel zu wählen.<br />

Dieses Verfahren wird in dem oben aufgeführten Beispiel angewendet, es wird ein numerischer<br />

Primärschlüssel (pk.id=1) verwendet.<br />

Das Remote-Interface einer Entity-Bean bietet u.a. die Methode getPrimaryKey() an. Mit<br />

Hilfe dieser Methode kann der Primärschlüsselwert der Entity-Bean ermittelt werden. Wenn<br />

mit Hilfe der Primärschlüssel Beziehungen zwischen Entity-Beans aufgebaut werden, entstehen<br />

zwangsläufig relational entwickelte EJB-Anwendungen, da z.B. Methoden geschrieben<br />

werden müssen, die nur numerische Werte der Primärschlüssel zurückgeben. Dies wird<br />

durch das folgende Beispiel verdeutlicht:<br />

public class ReservationBean implements javax.ejb.EntityBean {<br />

public int customerID;<br />

public int cruiseID;<br />

public int cabinID;<br />

public double price;<br />

public javax.ejb.EntityContext ejbContext;<br />

public ReservationPK ejbCreate(Customer customer, Cruise cruise,<br />

Cabin cabin, double price) {<br />

try {<br />

this.customerID = ((CustomerPK)customer.getPrimaryKey()).id;<br />

this.cruiseID = ((CruisePK)cruise.getPrimaryKey()).id;<br />

this.cabinID = ((CabinPK)cabin.getPrimaryKey()).id;<br />

this.price = price;<br />

}<br />

catch (RemoteException re) {<br />

throw new EJBException(re);<br />

}<br />

return null;<br />

}<br />

...<br />

public int getCabinID( ) {|<br />

return cabinID;<br />

}<br />

public int getCustomerID( ){


KAPITEL 7. ABBILDUNG EINES OBJEKT-MODELLS AUF EIN EJB-MODELL 66<br />

return customerID;<br />

}<br />

public int getCruiseID( ){<br />

return cruiseID;<br />

}<br />

...<br />

7.3 EJB-Komponenten basierend auf Java-Objektidentität<br />

Die in Kapitel 6 beschriebene Beispielanwendung wurde aus EJB-Komponenten entworfen,<br />

die auf Java-Objektidentität basieren. Es wurde anstatt einen künstlichen Primärschlüssel<br />

einzuführen ein Attribut title der EJB-Komponente als Primärschlüssel ausgewählt.<br />

In der Beispielanwendung aus Kapitel 6 sind Beziehungen zwischen den Objekten der Klasse<br />

SubjectHeading, Content und ElementaryWork sowie zwischen Objekten der Klasse<br />

ElementaryWork vorhanden. Diese Beziehungen werden in der Beispielanwendung<br />

über die Java-Objektidentität festgehalten, wie in dem folgenden Ausschnitt der Klasse ElementaryWork<br />

zu sehen ist:<br />

public class ElementaryWork implements Serializable {<br />

private Vector elementaryWorkVector = null;<br />

private String title;<br />

private SubjectHeading subjectHeading;<br />

private Content content;<br />

private ElementaryWork parent = null;<br />

...<br />

public ElementaryWork(String title) {<br />

this.title = title;<br />

elementaryWorkVector = new Vector();<br />

}<br />

public ElementaryWork(String title, SubjectHeading subjHead,<br />

Content cont) {<br />

this.title = title;<br />

this.subjectHeading = subjHead;<br />

this.content = cont;<br />

elementaryWorkVector = new Vector();<br />

}<br />

}<br />

...<br />

CompDir.add(subjHead.getName(), title, cont.getURI());<br />

Jedes ElementaryWork-Objekt besitzt durch die Attribute subjectHeading und content<br />

direkte Referenzen auf die Typen SubjectHeading bzw. Content. Die Grundlage


KAPITEL 7. ABBILDUNG EINES OBJEKT-MODELLS AUF EIN EJB-MODELL 67<br />

dieser Referenzen ist die Java-Objektidentität.<br />

Die persistente Speicherung der Objekte wird durch die Zuordnung eines ElementaryWork-<br />

Objektes zu der Entity-Bean WorkBean realisert, wobei das ElementaryWork-Objekt als<br />

Wurzel-Objekt fungiert. Dieses ElementaryWork-Objekt ist dabei ein Attribut der Entity-<br />

Bean und wird vom EJB-Container automatisch persistent gespeichert. Der folgende Ausschnitt<br />

aus der Klasse WorkBean macht dies deutlich:<br />

public class WorkBean implements EntityBean {<br />

public ElementaryWork work = null;<br />

/**<br />

* EJB-Attributes<br />

*/<br />

private EntityContext context;<br />

public String title;<br />

}<br />

public String ejbCreate(String title) {<br />

work = new ElementaryWork(title);<br />

this.title = title;<br />

return null;<br />

}<br />

...<br />

Der Vorteil dieser Lösung liegt darin, daß die Anwendung in objektorientierter Weise entwickelt<br />

werden kann. Es findet keine „Beeinflussung“ durch relationale Strukturen wie z.B.<br />

Primärschlüssel statt. Es ist bei dieser Lösung möglich, Beziehungen zwischen Objekten des<br />

Typs ElementaryWork in objektorientierter Weise aufzubauen und zur persistenten Speicherung<br />

einer Entity-Bean zuzuordnen, wie das folgende Beispiel zeigt:<br />

...<br />

WorkHome elworkHome = null;<br />

Work elemwork = null;<br />

elworkHome = (WorkHome)PortableRemoteObject.narrow(objref,<br />

WorkHome.class);<br />

...<br />

ElementaryWork elwork1 = new ElementaryWork("ElWork1",<br />

new SubjectHeading("subject1"),<br />

new Content("content1"));<br />

ElementaryWork elwork2 = new ElementaryWork("ElWork2",<br />

new SubjectHeading("subject2"),<br />

new Content("content2"));<br />

elwork1.add(elwork2);<br />

elemwork = elworkHome.create("Themengruppe");


KAPITEL 7. ABBILDUNG EINES OBJEKT-MODELLS AUF EIN EJB-MODELL 68<br />

elemwork.add(elwork1);<br />

...<br />

Jeder Primärschlüssel ist eindeutig innerhalb eines EJB-Containers. Zwei wertgleiche Primärschlüssel<br />

zweier EJB-Container des selben Herstellers sind nicht untereinander austauschbar.<br />

Es ist z.B. nicht möglich, mit einem Primärschlüssel ContentPK mit dem Wert 1 eine<br />

Entity-Bean in einem zweiten EJB-Container über die Home-Interface Methode findBy-<br />

PrimaryKey zu instantiieren (vergl. [Monson-Haefel 00]).<br />

7.4 Vergleich der Lösungen<br />

In Abschnitt 7.3 wurde ein Beispiel aufgeführt, bei dem Referenzen zwischen Objekten mit<br />

Hilfe der Java-Objektidentität festgehalten wurden. Kennzeichnend für dieses Beispiel war,<br />

daß alle referenzierten Objekte „normale“ Java-Objekte waren, d.h. es handelte sich nicht<br />

um Enterprise JavaBeans Komponenten.<br />

Im Gegensatz dazu wurde in Abschnitt 7.2 ein Beispiel aufgeführt, daß Primärschlüssel einsetzt.<br />

Der Vorteil der auf Java-Objektidentität basierenden Lösung liegt darin, daß die objektorientierte<br />

Anwendungsentwicklung nicht durch relationale Strukturen beeinflusst wird.<br />

Ein weiterer positiver Aspekt ist, daß das Objektmodell fast ohne Modifikation in ein EJB-<br />

Modell überführt werden kann. Weiterhin wird die komplexe Behandlung von Beziehungen<br />

zwischen Entity-Beans mittels der Primärschlüssel vermieden.<br />

Es gibt jedoch auch einen Nachteil dieses Lösungsansatzes. Wenn ein Objektmodell ohne<br />

größere Modifikationen in ein EJB-Modell überführt wird, dann bedeutet dies, daß die auf<br />

Java-Objektidentität basierenden Objekte nur dann vom EJB-Container persistent gespeichert<br />

werden können, wenn sie als Attribute von Entity-Beans definiert werden. Eine vom<br />

EJB-Container automatisch verwaltete persistente Speicherung muß im EJB-Komponentenmodell<br />

immer über die Entity-Beans erfolgen. Daher muß in dem hier betrachteten Fall eine<br />

Entity-Bean als persistente Hülle oder als Dekorierer (vergl. decorator-pattern in [Gamma et al.<br />

95]) bzw. als Zustandsträger der persistenten Speicherung eingeführt werden.<br />

In einem solchen Fall entstehen grobgranulare Entity-Beans, die ein abhängiges Objekt als<br />

Attribut besitzen. Diese abhängigen Objekte können jedoch weitere komplexe Objekte aggregieren.<br />

Dieses Verfahren birgt den Nachteil, daß unter Umständen sehr viele Objekte<br />

an einer Entity-Bean hängen und auch nur über diese Entity-Bean erreichbar sind. In einer<br />

Umgebung, in der hunderte von Benutzern gleichzeitig diese Entity-Bean verwenden<br />

wollen, kann es zu Performanzproblemen kommen. Die Ursache hierfür liegt in der EJB-<br />

Spezifikation, in der parallele bzw. nebenläufige Zugriffe auf Entity-Beans nicht erlaubt werden<br />

(vergl. [Matena, Hapner 99] und [Monson-Haefel 00]). Es können mehrere Clients mit<br />

einem EJB-Objekt einer Entity-Bean verbunden sein, aber es kann zu jedem Zeitpunkt nur<br />

ein Client eine Geschäfts-Methode der Entity-Bean aufrufen. Für die Dauer eines Methodenaufrufs<br />

ist die Entity-Bean für andere Clients nicht verfügbar (vergl. [Monson-Haefel 00]).<br />

Bei dem in Abschnitt 7.2 aufgeführten Beispiel wurden Referenzen zwischen Entity-Beans<br />

mit Hilfe von Primärschlüsseln festgehalten. Da in [Matena, Hapner 99] die Behandlung<br />

von Beziehungen zwischen Entity-Beans nicht betrachtet werden, ist der Bean-Entwickler


KAPITEL 7. ABBILDUNG EINES OBJEKT-MODELLS AUF EIN EJB-MODELL 69<br />

für diesen Bereich selbst verantwortlich, d.h. der EJB-Container stellt keinerlei automatischen<br />

Dienste für die Verwaltung von Beziehungen zwischen Entity-Beans zur Verfügung.<br />

Um dennoch die vom EJB-Container angebotenen Dienste bezüglich der automatischen persistenten<br />

Speicherung in Anspruch nehmen zu können, muß der Bean-Entwickler wie in<br />

[Holland 01] beschrieben mit Hilfe der Callback-Methoden die Beziehungen zwischen den<br />

Entity-Beans selbst verwalten.<br />

Dieser Ansatz beruht jedoch auf den Einsatz von Primärschlüsseln, die in gewisser Weise<br />

die Anwendungsentwicklung nach objektorientierten Verfahren behindern.


Kapitel 8<br />

Zusammenfassung und Ausblick<br />

8.1 Zusammenfassung<br />

Die in dieser Arbeit betrachteten EJB-Komponenten einer Beispielanwendung ließen sich<br />

ohne Modifikation an den EJB-Komponenten auf allen behandelten Application-Servern installieren.<br />

Auch die Lauffähigkeit war auf allen betrachteten Application-Servern gegeben.<br />

Die Beispielanwendung wurde ausgehend von einem objektorientierten Modell entwickelt.<br />

Bei der anschliessenden „Abbildung“ auf eine EJB-Anwendung gab es eine Schwierigkeit<br />

zu überwinden: die Abbildung der Objektidentität auf einen Primärschlüssel. Das Problem<br />

ergibt sich aufgrund der assoziativen Identifikation bei relationalen Datenbanksystemen und<br />

der referentiellen Identifikation (vergl. [Schmidt, Matthes 98]) bei objektorientierten Systemen.<br />

Da man bei Entity-Beans den Primärschlüssel verwenden muß, entsteht eine relational gedachte<br />

Anwendung. Die Begriffe aus der relationalen Welt wie Primärschlüssel oder Fremdschlüssel<br />

werden in die objektorientierte Anwendung „hineingetragen“. Dies erschwert die<br />

Anwendungsentwicklung in objektorientierter Weise.<br />

Die Wahl des EJB-Servers kann entscheidend für den Erfolg oder Mißerfolg des EJB-Einsatzes<br />

sein. Wenn man sich mit den Werkzeugen eines EJB-Servers auskennt, bedeutet dies noch<br />

lange nicht, daß man mit den Werkzeugen anderer EJB-Server ebenso gut zurechtkommt.<br />

Als Beispiel lassen sich BEA aufführen, bei dem die Werkzeuge überwiegend kommandozeilenorientiert<br />

sind und SilverStream, bei dem die Werkzeuge fast ausschließlich graphischorientiert<br />

sind.<br />

Erschwerend kommt noch hinzu, daß sich zwischen zwei Releases eines Herstellers die Bedienung<br />

des EJB-Server verändert. So z.B. beim Releasewechsel von 5.1 auf 6 bei Bea. In der<br />

Version 5 gibt es die Möglichkeit EJB-Komponenten mit Hilfe einer grafischen Oberfläche<br />

zu installieren. In der Version 6 gibt es eine HTML-Schnittstelle, über die EJB-Komponenten<br />

auf dem EJB-Server installiert werden müssen.<br />

Dieses Beispiel zeigt, daß es schwierig sein kann, selbst bei einem Produkt eines Herstellers<br />

auf dem Laufenden zu bleiben.<br />

70


KAPITEL 8. ZUSAMMENFASSUNG UND AUSBLICK 71<br />

Wie in Kapitel 6 bereits beschrieben, wird das Rollenkonzept der EJB-Spezifikation bei den<br />

Herstellern unterschiedlich behandelt. Einige Hersteller legen mehr andere wiederum weniger<br />

Wert auf die Umsetzung der einzelnen Rollen in dem Application-Server. Erschwehrend<br />

kommt hinzu, daß die Umsetzung der Rollenkonzepte zwischen Versionssprüngen eines<br />

Application-Servers unterschiedlich sein können.<br />

Obwohl alle Hersteller ihre Produkte auf Basis der EJB-Spezifikation aufbauen, gibt es z.T.<br />

erhebliche Unterschiede in Konfiguration, Installation sowie Art und Umfang der Werkzeuge.<br />

8.2 Ausblick<br />

In der heutigen Softwareentwicklung unterliegt die Software einem sehr schnellen Alterungsprozeß.<br />

Innerhalb eines Jahres werden in manchen Fällen mehrere Versionen einer<br />

Software entwickelt und herausgegeben. So sind auch die Application-Server hiervon betroffen.<br />

Zum Ende dieser Arbeit ist z.B. bereits die Version 7 des BEA Application-Server<br />

fertiggestellt, die zu Beginn der Arbeit in der Version 5.1 vorlag.<br />

Auch die Spezifikation des EJB-Komponentenmodells wird von [Sun ] stetig weiterentwickelt<br />

und optimiert. In der EJB-Spezifikation 2.0 [DeMichiel et al. 00] wurde u.a. die automatische<br />

Verwaltung von Beziehungen zwischen Entity-Beans (Container-Managed Relations, CMR)<br />

hinzugefügt. Dieses reduziert den Programmieraufwand für den Bean-Entwickler, denn bisher<br />

müssen komplexe Beziehungen zwischen Entity-Beans manuell in den Beans programmiert<br />

werden.<br />

Ein weiteres Problem bei Entity-Beans in der hier betrachteten EJB-Spezifikation 1.1 ist, daß<br />

alle Methodenaufrufe einer Entity-Bean letztendlich entfernte Aufrufe sind, selbst wenn der<br />

Aufrufer eine Bean im selben EJB-Container ist. Konkret bedeutet dies, daß ein Aufruf einer<br />

Methode einer lokalen Bean sämtliche Protokolle durchläuft wie ein Aufruf, der einer Bean<br />

gilt, die an einem ganz anderen Ort liegt.<br />

Diese Tatsache hat starken Einfluß auf die Performanz von Anwendungen, die auf EJB-<br />

Komponenten aufbauen. Um solchen Fällen differenzierter begegnen zu können, wurden<br />

u.a. die sog. local interfaces in der EJB-Spezifikation 2.0 eingeführt.<br />

Um das Problem der Beziehungen zwischen EJB-Komponenten zu lösen, besteht die Möglichkeit<br />

sog. Objekt-Relationale Mapping-Werkzeuge einzusetzen (vergl. [ObjRelMapping a],<br />

[ObjRelMapping b]). Diese Werkzeuge sind in der Lage, Objekte persistent in einer relationalen<br />

Datenbank zu speichern. Das Problem beim Einsatz dieser Werkzeuge ist, daß diese<br />

Werkzeuge nicht für jeden Application-Server verfügbar sind, was die Portabilität der EJB-<br />

Anwendungen einschränken würde.<br />

Die EJB-Spezifikation erlaubt es, wie in dieser Arbeit anhand einer Beispielanwendung gezeigt,<br />

EJB-Komponenten zu schreiben, die ohne Modifikation in verschiedenen Application-<br />

Servern installierbar und lauffähig sind, sofern keine produktspezifischen Erweiterungen<br />

verwendet werden. In den meisten Fällen wird es wohl nicht gelingen, ohne den Einsatz<br />

von produktspezifischen Funktionen auszukommen.


KAPITEL 8. ZUSAMMENFASSUNG UND AUSBLICK 72<br />

Ein Verzicht auf den Einsatz solcher Zusatzfunktionen bedeutet in der Regel, daß Eigenentwicklungen<br />

durchgeführt werden müssen. Dies hat wiederum zur Folge, daß mehr Zeit<br />

und mehr Programmieraufwand für die Durchführung eines Projektes eingeplant werden<br />

müssen. Es müssen sozusagen Entscheidungen darüber getroffen werden, ob der herstellerunabhängige<br />

und EJB-konforme Weg oder der herstellerabhängige und nicht EJB-konforme<br />

Weg gewählt wird.<br />

Eine der größten Herausforderungen bei der Entwicklung von neuen EJB-Anwendungen ist<br />

die Behandlung von Primärschlüsseln und Objektidentitäten. In objektorientierten Anwendungen<br />

wird kein zusätzlicher künstlicher Schlüssel für die eindeutige Identifizierung benötigt,<br />

da jedes Objekt per se eindeutig ist. Bei zwei in Beziehung stehenden Objekten hat das<br />

eine beteiligte Objekt schon aufgrund der Beziehung mit dem anderen Objekt eine Identität.


Literaturverzeichnis<br />

Alur et al. 01: Alur, Deepak, Crupi, John, und Malks, Dan. Core J2EE Patterns: Best Practices<br />

and Design Strategies. Prentice Hall / Sun Microsystems Press, 2001.<br />

BEA a: BEA Systems Inc., http://www.bea.com/products/tuxedo/index.shtml).<br />

BEA b: BEA Systems Inc., http://www.beasys.com, http://www.bea.com.<br />

Benfield 99: Benfield, Steve. What Do Application Servers Really Do? Web Techniques, Februar<br />

1999. http://www.webreview.com/1999/02_26/developers/02_26_99_5.shtm.<br />

Blair 01: Blair, Liz. Build to Spec! Java Developer’s Journal, Juli 2001.<br />

http://www.JavaDevelopersJournal.com/,<br />

http://developer.java.sun.com/developer/technicalArticles/J2EE/build/.<br />

Borland : Borland Corporation, http://www.borland.com.<br />

CetusLinks : http://www.cetus-links.org/oo_distributed_objects.html.<br />

DeMichiel et al. 00: DeMichiel, Linda G., Yalcinalp, L. Ümit, und Krishnan, Sanjeev. Enterprise<br />

JavaBeans Specification Version 2.0, Public Draft. Technical report, Sun Microsystems Inc.,<br />

Mai 2000. http://java.sun.com/products/ejb.<br />

Denninger, Peters 00: Denninger, Stefan und Peters, Ingo. Enterprise JavaBeans. Addison-<br />

Wesley, 2000.<br />

Duden 93: Duden Informatik. Dudenverlag, 2. edition, 1993.<br />

Ernst, Schneider 00: Ernst, Matthias und Schneider, Daniel. Konzepte und Implementierungen<br />

moderner virtueller Maschinen: Nebenläufigkeit, automatische Speicherverwaltung und dynamische,<br />

optimierende Compiler für Java. Diplomarbeit, Fachbereich Informatik, Universität<br />

Hamburg, Germany, Dezember 2000.<br />

Fowler, Scott 99: Fowler, Martin und Scott, Kendall. UML Distilled - A brief guide to the Standard<br />

Object Modelling Language. Addison-Wesley, 2nd edition, 1999.<br />

Frank : Frank, Ulrich. Software-technische Konzepte und Perspektiven für die Gestaltung betrieblicher<br />

Informationssysteme.<br />

Gamma et al. 95: Gamma, Erich, Helm, Richard, Johnson, Ralph, und Vlissides, John. Design<br />

Patterns. Addison-Wesley, 1995.<br />

73


LITERATURVERZEICHNIS 74<br />

Griffel 98: Griffel, Frank. Componentware – Konzepte und Techniken eines Softwareparadigmas.<br />

dpunkt-Verlag, 1998.<br />

Henrich 01: Henrich, Andreas. Komponentenbasierte Architekturen und Systeme. Universität<br />

Bamberg, 2001.<br />

http://ai1.inf.uni-bayreuth.de/lehre/ss_2001/rechner_und_systemarchitekturen/<br />

vorlesungsskript/3komponenten.pdf.<br />

Holland 01: Holland, Grant. Entity bean relationships in EJB 1.1. Java Report, April 2001.<br />

http://www.javareport.com.<br />

IBM a: IBM Corporation, http://www-4.ibm.com/software/ts/cics/about/<br />

gim/dfhe2ch1.html.<br />

IBM b: IBM Corporation, http://www.ibm.com.<br />

InfoWeek 00: Middleware. Application-Server: IT-Welten in Verbindung. Information Week,<br />

April 2000, Nr. 11.<br />

http://www.informationweek.de/index.php3?/channels/channel23/001142.htm.<br />

J2EE : http://de.iplanet.com/products/infrastructure/app_servers/migration/j2ee.html.<br />

Larman 01: Larman, Craig. Applying UML and Patterns - An Introduction to Object-Oriented<br />

Analysis and Design and the Unified Process. Pearson Education, 2nd edition, 2001.<br />

Lewis : Lewis, Thomas. VB COM - A Visual Basic Programmer’s Introduction To COM. Wrox<br />

Press.<br />

Marinescu 02: Marinescu, Floyd. EJB Desin Patterns: Advanced Patterns, Processes, and Idioms.<br />

John Wiley & Sons, 2002.<br />

Matena, Hapner 99: Matena, Vlada und Hapner, Mark. Enterprise JavaBeans Specification<br />

v1.1, Final Release. Technical report, Sun Microsystems Inc., Dezember 1999.<br />

http://java.sun.com/products/ejb.<br />

Microsoft : Microsoft Corporation, http://www.microsoft.com.<br />

Monson-Haefel 00: Monson-Haefel, Richard. Enterprise JavaBeans. O’Reilly, 2nd edition,<br />

2000.<br />

Monson-Haefel 01: Monson-Haefel, Richard. Enterprise JavaBeans in a Nutshell , 2001.<br />

http://www.ejbnow.com/articles/ejb_nutshell.html.<br />

ObjRelMapping a: http://www.object-relational.com/articles/objectrelational_mapping.html.<br />

ObjRelMapping b: http://www.objectarchitects.de.<br />

OMG : OMG, Object Management Group, http://www.omg.org.<br />

Oracle : Oracle Corporation, http://www.oracle.com.<br />

Persistence : Persistence Corporation, http://www.persistence.com.


LITERATURVERZEICHNIS 75<br />

Ray 01: Ray, Erik T. Einführung in XML. O’Reilly, 2001.<br />

Rechenberg, Pomberger 97: Rechenberg, Peter und Pomberger, Gustav. Informatik-Handbuch.<br />

Hanser Verlag, 1997.<br />

Roman 99: Roman, Ed. Mastering Enterprise JavaBeans and the Java 2 Platform. John Wiley &<br />

Sons Inc., 1999.<br />

Saake, Sattler 00: Saake, Gunter und Sattler, Kai-Uwe. Datenbanken & Java: JDBC, SQLJ und<br />

ODMG. dpunkt.verlag, Mai 2000.<br />

Schmidt, Matthes 98: Schmidt, Joachim W. und Matthes, Florian. Datenbankhandbuch Kapitel<br />

1: Datenbankmodelle und Datenbanksprachen. (unpublished manuscript), 1998.<br />

Segev, Bichler 99: Segev, A. und Bichler, M. Handbook on Electronic Commerce, S. 313–337.<br />

Springer Verlag, 1999.<br />

Silverstream : http://www.silverstream.com.<br />

Sun : Sun Microsystems Inc., http://www.sun.com.<br />

Sun 01: The Java 2 Platform, Enterprise Edition Blueprints , 2001.<br />

http://java.sun.com/j2ee/blueprints/.<br />

Sybase : Sybase Corporation, http://www.sybase.com.<br />

Szyperski 97: Szyperski, Clemens. Component Software Beyond Object-Oriented Programming.<br />

Addison-wesley, 1st edition, 1997.<br />

XML : http://www.w3.org/XML.


Erklärung<br />

Hiermit erkläre ich, daß ich die vorliegende Diplomarbeit selbständig durchgeführt und keine<br />

anderen als die angegebenen Quellen und Hilfsmittel benutzt habe.<br />

Hamburg, den 20. November 2002<br />

(Celal Akçiçek)

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!