Paper (PDF) - STS
Paper (PDF) - STS
Paper (PDF) - STS
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)