Universität des Saarlandes Naturwissenschaftlich-Technische Fakultät I Fachrichtung Informatik Bachelor-Arbeit Verteilte Annotation von Dokumenten – Architekturentwurf und Implementierung eines Frameworks auf J2EE-Basis angefertigt von Frank Stefan Fuchs unter der Leitung von Prof. Dr. Gerhard Weikum am Max Plank Institut für Informatik D5: Databases and Information Systems Saarbrücken, den 29.05.2006 Eidesstattliche Erklärung Hiermit versichere ich an Eides statt, dass ich diese Arbeit selbstständig angefertigt habe und keine anderen als die angegebenen Hilfsmittel verwendet habe. Alle wörtlichen oder sinngemäßen Entlehnungen sind deutlich als solche gekennzeichnet. Die Arbeit wurde bisher in gleicher oder ähnlicher Form keiner anderen Prüfungskommission vorgelegt und auch nicht veröffentlicht. Saarbrücken, den 29.05.2006 Frank Stefan Fuchs Inhaltsverzeichnis I Inhaltsverzeichnis 1 2 Einleitung 1.1 Motivation .................................................................................................................. 1 1.2 Zielsetzung und Aufbau der Arbeit............................................................................ 1 Architektur 3 2.1 Umfeld und Anforderungen ....................................................................................... 3 2.2 Plattformen ................................................................................................................. 4 2.2.1 .NET ................................................................................................................... 4 2.2.2 J2EE ................................................................................................................... 4 2.2.3 Beurteilung ......................................................................................................... 4 2.3 3 1 Bestandteile ................................................................................................................ 5 Verwendete Technologien 3.1 7 J2EE ........................................................................................................................... 7 3.1.1 Verteilte mehrschichtige Anwendungen ............................................................ 7 3.1.2 J2EE-Komponenten ........................................................................................... 8 3.2 Enterprise Java Beans................................................................................................. 9 3.2.1 Session Beans................................................................................................... 10 3.2.2 Entity Beans ..................................................................................................... 12 3.2.3 Message-Driven Beans..................................................................................... 13 3.3 Web Services............................................................................................................ 13 3.3.1 Begriffsbestimmung und Funktionsweise........................................................ 13 3.3.2 Web Services und J2EE ................................................................................... 16 3.4 Applikationsserver ................................................................................................... 17 Inhaltsverzeichnis 4 Zentrale Koordinationskomponente II 19 4.1 Aufbau und Architektur ........................................................................................... 19 4.2 AClientControllerBean............................................................................................. 20 4.2.1 Web Service Endpoint Interface ...................................................................... 20 4.2.2 Service-Implementierung ................................................................................. 21 4.3 Message-Queue und AMessageControllerBean....................................................... 22 4.3.1 Message-Queue ................................................................................................ 22 4.3.2 AMessageControllerBean ................................................................................ 23 4.4 AServerControllerBean............................................................................................ 24 4.4.1 Web Service Endpoint Interface ...................................................................... 24 4.4.2 Service-Implementierung ................................................................................. 25 4.5 AServerDataBean..................................................................................................... 25 4.5.1 Remote Interface .............................................................................................. 26 4.5.2 Home Interface................................................................................................. 27 4.5.3 Bean-Implementierung..................................................................................... 27 4.6 ADocumentDataBean............................................................................................... 29 4.6.1 Remote Interface .............................................................................................. 30 4.6.2 Home Interface................................................................................................. 31 4.6.3 Bean-Implementierung..................................................................................... 32 4.7 Datenbank-Schnittstelle ........................................................................................... 34 5 Beispiel-Implementierung eines Clients 36 6 Kommunikation 40 7 Evaluation 42 8 7.1 Versuchsaufbau ........................................................................................................ 42 7.2 Lastentest.................................................................................................................. 43 Zusammenfassung und Ausblick 46 Inhaltsverzeichnis III A 48 Installation A.1 Framework ............................................................................................................... 48 A.2 Client ........................................................................................................................ 50 A.3 Annotationsserver..................................................................................................... 51 B Abbildungsverzeichnis 52 C Tabellenverzeichnis 53 D Quelltextverzeichnis 54 E Literaturverzeichnis 55 1 Einleitung 1 1 Einleitung 1.1 Motivation In den letzten Jahren hat sich das World Wide Web zu einer Ansammlung von Dokumenten für Personen entwickelt. Es ist weniger ein Medium, welches maschinenlesbare Daten enthält und auf Grund derer die Semantik der Inhalte formal festgelegt wird. Es bedarf aber einer Vernetzung von Informationen, damit Abfragen wie „Welcher Fußballer hat die meisten Tore bei der WM 2006 geschossen“ beantwortet werden können. Diese erweiterte Funktionalität des World Wide Webs wird als „Semantisches Netz“1 bezeichnet. Die logische Zusammenfassung solcher Informationen wird Ontologie genannt. Da jedoch die Informationen nicht im Vorhinein als Ontologien verfügbar sind, bedarf es Techniken, die dies verwirklichen. Eine Haupttechnik hierbei ist das Annotieren von Dokumenten durch NLP-Software (Natural Language Processing) wie ANNIE2 oder Minorthird3. Durch die hohe Anzahl von Dokumenten (die deutsche Wikipedia-Seite allein mit über 390.000 Artikeln) und der damit verbundenen Rechenlast bedarf es einer Lastenverteilung. Da die oben genannten Werkzeuge als typische Einzelplatzlösungen konzipiert und nicht für das Verwenden im Netz vorgesehen sind, wird ein Framework benötigt, das diese Unzulänglichkeiten beseitigt. 1.2 Zielsetzung und Aufbau der Arbeit Ziel dieser Arbeit ist es, ein webbasiertes Framework für die verteile Annotation von Dokumenten zu entwerfen und zu implementieren. Das Framework soll insbesondere die Integration von Annotationstools wie ANNIE und Minorthird als Backendsysteme leisten. Dabei stellt sich die Frage nach dem Senden, Empfangen und Verteilen einer großen Anzahl von Dokumenten von den Clients an die Backendsysteme. 1 Berners-Lee, T.; Hendler, J.; Lassila, O.: The Semantic Web, Scientific American, Mai 2001. 2 Cunningham, H. et al.: Developing Language Processing Components with GATE (a User’s Guide), University of Sheffield, 2001-2006. 3 Cohen, W.: Minorthird: Methods for Identifying Names and Ontological Relations in Text using Heuristics for Inducing Regularities from Data, http://minorthird.sourceforge.net, 2004. 1 Einleitung 2 Im ersten Teil wird auf das Umfeld eingegangen, in dem das Framework zu dienen hat. Auf Grund dieses Umfeldes werden Umsetzungsalternativen bewertet und die grobe Architektur abgeleitet. Kapitel 3 gibt einen Überblick über die verwendeten Technologien, dabei wird auf die J2EE4 (Java 2 Enterprise Edition) und deren Bestandteile eingegangen. Einen großen Raum in diesem Kapitel nimmt dabei der Abschnitt „Web Services“ ein, da Web Services den Großteil der Kommunikation mit dem Framework bereitstellen werden. Der Hauptbestandteil dieser Arbeit wird im darauf folgenden Kapitel 4 vorgestellt. Hier wird die Zentrale Koordinationskomponente beschrieben. Dabei werden die einzelnen Komponenten näher erläutert, ihre Funktion in der Gesamtarchitektur und ihre Bedeutung für das Empfangen, Senden und Verteilen von Dokumenten dargestellt. In Kapitel 5 wird auf die Beispiel-Implementierung eines Clients eingegangen, welcher über Web Services mit dem Framework interagiert. Auf den Kommunikationsablauf zwischen Zentraler Koordinationskomponente, den Clients und den Annotationsservern5 wird in Kapitel 6 eingegangen. In Kapitel 7 wird die Implementierung des Frameworks einem Lastentest unterzogen, um ihre Leistung beurteilen zu können. Eine Zusammenfassung und Ausblick auf zukünftige Entwicklungen sind im abschließenden Kapitel 8 zu finden. 4 Sun Microsystems: J2EE v1.4 Documentation, http://java.sun.com/j2ee/1.4/docs/, 2004. 5 Fuchs, D.: Verteilte Annotation von Dokumenten – Entwurf und Implementierung eines modularen Annotationsservers auf Basis von NLP-Technologien, Universität des Saarlandes, 2006 2 Architektur 3 2 Architektur 2.1 Umfeld und Anforderungen Um die Integration von heterogenen Annotationswerkzeugen als Backendsysteme und die Fähigkeit, eine große Anzahl von Dokumenten verteilt im Internet zu annotieren, zu gewährleisten, muss das Framework einige Kriterien an die zu verwendende Plattform stellen. Hierbei können folgende Kriterien von Anforderungen abgeleitet werden: • Integration bestehender Systeme Selten wird eine neue Anwendung ohne Bezug auf bestehende Anwendungen entwickelt. Meist ist diese mit einer bereits bestehenden heterogenen IT-Landschaft zu verbinden. Dazu muss die Plattform Möglichkeiten der Integration bieten. • Skalierbarkeit Gerade bei Anwendungen im weltweiten Netz ist es nicht möglich, die Last vorher zu sagen, die die Anwendung auszuhalten hat. Daher ist es wichtig, dass die Lastenverteilung unabhängig von der Implementierung der Anwendung konfiguriert werden kann. • Flexibilität Bei einer Anwendung sollte die Möglichkeit bestehen, die Laufzeit- und Entwicklungsumgebung nach den Anforderungen der Anwendung zusammen zu stellen. Für die Implementierung des Frameworks kommen grundsätzlich zwei Plattformen in Betracht: .NET6 von Microsoft und J2EE7 von Sun Microsystems. 6 Microsoft Corporation: .NET Framework 1.0, http://msdn.microsoft.com/netframework/previous/v1.0/ default.aspx, 2002. 7 Sun Microsystems: J2EE v1.4 Documentation, http://java.sun.com/j2ee/1.4/docs/, 2004. 2 Architektur 4 2.2 Plattformen 2.2.1 .NET .NET ist eine Implementierung des Common Language Infrastructure Standards8 für Windows durch die Firma Microsoft. Sie besteht aus einem Framework von Klassenbibliotheken und aus angeschlossenen Diensten, die gemeinsam eine Basis für Eigenentwicklungen bieten. Die Programme liegen ähnlich wie in Java in einem Zwischencode vor und benötigen daher die .NET-Laufzeitumgebung. Was .NET von anderen auf Zwischencode basierenden Laufzeitumgebungen signifikant unterscheidet, ist das berücksichtigte Nebeneinander mehrerer Programmiersprachen. 2.2.2 J2EE Im Gegensatz zu .NET ist Java 2 Enterprise Edition von Sun Microsystems kein Produkt, sondern eine Spezifikation für verteilte Geschäftsanwendungen. Deren Implementierung ist den Herstellern vorbehalten. Sie stellt einen komponenten-basierten Ansatz für den Entwurf, Entwicklung, Aufbau und Deployment von Geschäftsapplikationen zur Verfügung. Die J2EE-Plattform bietet ein mehrschichtiges verteiltes Applikationsmodell, wieder verwendbare Komponenten, ein vereinheitlichtes Sicherheitsmodell, flexible Transaktionskontrolle und Web Services-Unterstützung durch den Austausch von integrierten Daten über XML-basierte offene Standards und Protokolle.9 2.2.3 Beurteilung J2EE und .NET sind zwei ähnliche Ansätze für die Entwicklung von Anwendungs-Frameworks. 8 Microsoft Corporation: Common Language Infrastructure Standard, http://msdn.microsoft.com/netframework/ ecma/, 2002-2006. 9 Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 1. 2 Architektur 5 Sowohl das J2EE- als auch das .NET-Architekturmodell basieren auf dem objekt-orientierten (OO) Vorgehen und besitzen mächtige OO-Frameworks (Klassenbibliotheken) für unterschiedliche Services wie Objekt-Persistenz, Komponenten-Management, Transaktionen, Web Services, asynchrone Kommunikation und Messaging.10 J2EE und .NET verwenden beide die Virtual Machine (VM)-Architektur. Die Anwendungsentwicklungs-Werkzeuge erzeugen Zwischencode anstatt plattform-spezifischen Binärcode. Dies bedeutet, dass die VM den Code in Echtzeit interpretiert oder die so genannte Just-InTime (JIT)-Übersetzung vornimmt. Beide Plattformen basieren auf mehrschichtige Architekturen.11 Für die Erstellung verteilter Anwendungen stehen die so genannten EJB-Container in J2EE bzw. die .NET Managed Objects in .NET zur Verfügung. In beiden Fällen wird die Verwaltung und Kontrolle der verteilten Objekte automatisch übernommen, ohne dass dies explizit implementiert werden muss. Die Attraktivität von J2EE wird insbesondere durch die Portabilität über unterschiedlichste Plattformen gestützt. J2EE ist ein offener Standard und eine Spezifikation, die unabhängig von der jeweils verwendeten Plattform ist. Im Falle von .NET dagegen, handelt es sich um ein konkretes Produkt und damit um einen einzigen Hersteller.12 2.3 Bestandteile Auf Grund der aufgeführten Vorteile der J2EE-Plattform (s. Kapitel 2.2), basiert das in dieser Arbeit entwickelte Framework auf das J2EE-Architekturmodell. Dieser Abschnitt gibt einen groben Überblick über den Aufbau und Architektur des Frameworks; eine ausführliche Beschreibung ihrer Funktionsweise und Komponenten erfolgt in den Kapiteln 4 und 5. Ein fester Bestandteil der J2EE-Architektur ist der J2EE-Applikationsserver. Er ist für die Steuerung der gesamten Anwendung verantwortlich (siehe Abbildung 1). Die FrameworkClients sind mit Hilfe von Web Services an das Framework angebunden. Als Backendsysteme dienen die Annotationsserver, die als Enterprise Information Systeme (EIS) im Framework 10 Younis, S.: J2EE vs. .NET An Executive Look, 2003, S. 3. 11 Younis, S.: J2EE vs. .NET An Executive Look, 2003, S. 3. 12 Thielscher, J.: J2EE und .NET zwei konkurrierende Standards?, Computer Zeitung, Mai 2002, S. 4. 2 Architektur 6 integriert sind. Die Datenhaltung erfolgt über eine Datenbank, die über eine DatenbankSchnittstelle vom J2EE-Applikationsserver angesprochen wird. Abbildung 1 : Überblick Framework 3 Verwendete Technologien 7 3 Verwendete Technologien 3.1 J2EE 3.1.1 Verteilte mehrschichtige Anwendungen Die J2EE-Plattform verwendet ein verteiltes mehrschichtiges (multi-tier) Applikationsmodell für Anwendungen. Die Anwendungslogik ist in Komponenten anhand ihrer Funktion aufgeteilt. Die unterschiedlichen Anwendungskomponenten, aus denen die J2EE-Applikation besteht, können auf verschiedenen Rechnern installiert sein. Die Aufteilung erfolgt in Abhängigkeit von der Schicht in der mehrschichtigen J2EE-Umgebung, der die Anwendungskomponente zugeordnet ist. Abbildung 2 zeigt zwei mehrschichtige J2EEApplikationen, die aus den im Folgenden beschriebenen Schichten bestehen:13 • Client-Schicht-Komponenten werden auf Client-Rechnern ausgeführt. • Web-Schicht-Komponenten werden auf dem J2EE-Server ausgeführt. • Business-Schicht-Komponenten werden ebenfalls auf dem J2EE-Server ausgeführt. • Enterprise Information System (EIS)-Schicht-Software wird auf dem EIS-Server ausgeführt. 13 Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 2. 3 Verwendete Technologien 8 Abbildung 2 : Mehrschichtige Anwendungen14 Obwohl J2EE-Applikationen aus den drei oder vier Schichten bestehen können, sind sie in der Regel dreischichtig. Der Grund dafür ist, dass die Applikationen meistens über drei Stellen verteilt sind: Client-Rechner, J2EE-Server und Datenbank-Rechner.15 3.1.2 J2EE-Komponenten J2EE-Applikationen bestehen aus Komponenten. Eine J2EE-Komponente ist eine in sich funktionierende Software-Einheit, einschließlich ihrer Klassen und Dateien, die in einer J2EE-Applikation eingebunden ist und die mit anderen Komponenten kommuniziert. Die J2EE-Spezifikation16 definiert hierbei folgende J2EE-Komponenten: • Applikations-Clients und Applets sind Komponenten, die auf einem Client-Rechner ausgeführt werden. • Java Servlet- und Java Server Pages (JSP)-Komponenten sind Web-Komponenten, die auf dem Applikationsserver ausgeführt werden. 14 In Anlehnung an: Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 3. 15 Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 2. 16 Sun Microsystems: J2EE Platform Specification 1.4, http://java.sun.com/j2ee/j2ee-1_4-fr-spec.pdf, 2004. 3 Verwendete Technologien • 9 Enterprise Java Beans-Komponenten sind Business-Komponenten, die ebenfalls auf dem Applikationsserver ausgeführt werden. J2EE-Komponenten sind in der Programmiersprache Java geschrieben und werden auf die gleiche Art und Weise kompiliert wie jedes andere Programm in dieser Sprache. Der Unterschied zwischen J2EE-Komponenten und „Standard“-Java-Klassen ist, dass J2EE-Komponenten in einer J2EE-Applikation eingebunden, wohlgeformt und im Einklang mit der J2EESpezifikation sind und von einem J2EE-Server ausgeführt werden. Da das Framework keine Web-Komponenten besitzt und mit Hilfe von Web Services kommuniziert, werden im Folgenden die Enterprise Java Beans und Web Services näher erläutert. 3.2 Enterprise Java Beans „Enterprise Java Beans sind nach der EJB-Spezifikation entworfene, serverseitige SoftwareKomponenten, die in der vom EJB-Container zur Verfügung gestellten Umgebung ablaufen. Sie realisieren die Geschäftslogik, auf die Anwendungen (als Clients bezeichnet) zugreifen.“17 Der EJB-Container stellt die Laufzeitumgebung für die Enterprise Java Beans im J2EE-Server zur Verfügung und erfüllt hierbei verschiedene Dienste: • Verwaltet den Lebenszyklus der Enterprise Java Beans. • Stellt die Persistenz für Entity Beans (siehe Abschnitt 3.2.2) bereit. • Regelt den Sicherheitsmechanismus und damit den Zugriff auf die Enterprise Java Beans. • Stellt Dienste bereit, um mit dem Java Naming and Directory Interface (JNDI)18 entfernte Objekte über ihren Namen zu finden. • Koordiniert verteilte Transaktionen. • Übernimmt die Remote-Kommunikation mit dem Client. Damit der EJB-Container diese Dienste erfüllen kann, benötigt er die Kontrolle über die Objekte der Enterprise Java Beans. Dies wird realisiert, indem der Client mit den Beans über 17 Backschat, M.: Enterprise Java Beans, Spektrum Akademischer Verlag, 2002. 18 Sun Microsystems: Java Naming and Directory Interface (JNDI), http://java.sun.com/products/jndi/, 2002. 3 Verwendete Technologien 10 vom J2EE-Server generierte Stubs kommuniziert, die ihrerseits mit den entsprechenden Methoden der Beans kommunizieren. Dazu besitzt jedes Enterprise Java Bean zwei zu implementierende Schnittstellen, eine Ausnahme hiervon bilden die Message-Driven Beans (siehe Abschnitt 3.2.3) und Stateless Session Beans für Web Services (siehe Abschnitt 3.3): • Das Home Interface stellt Methoden zum Erstellen und Finden der Bean-Objekte zur Verfügung. • Das Remote Interface stellt Methoden der Anwendungslogik für den Client bereit. Die EJB-Spezifikation19 unterscheidet drei Arten von Enterprise Java Beans: Session Beans, Entity Beans und Message-Driven Beans. 3.2.1 Session Beans Session Beans werden dazu verwendet, um die Funktionalität einer Anwendungslogik dem Client zur Verfügung zu stellen. Ein Session Bean realisiert somit den Ablauf (Workflow) einer Anwendung. Dabei greift das Bean zumeist auf andere Beans, insbesondere Entity Beans, zu. Session Beans werden in Stateless Session Beans (zustandslose) und Stateful Session Beans (zustandsbehaftete) unterteilt. Stateless Session Beans werden bei jedem Aufruf eines Clients neu erzeugt, das heißt sie können sich den Zustand einer vorherigen Anfrage nicht merken. Sie eignen sich für einfache Funktionsaufrufe, wie zum Beispiel Zahlungsvorgänge. Der Kunde sendet seine Bankdaten und den Betrag an das Session Bean und erhält eine Bestätigung über den Erfolg des Vorgangs. Somit ist der Lebenszyklus eines Stateless Session Beans sehr einfach, welches die Abbildung 3 verdeutlicht.20 19 20 Sun Microsystems: Enterprise JavaBeans Specification 2.1, http://java.sun.com/products/ejb/docs.html, 2004. Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 858. 3 Verwendete Technologien 11 Abbildung 3 : Lebenszyklus eines Stateless Session Beans21 Eine klassische Anwendung für das Stateful Session Bean ist der Gebrauch eines Warenkorbes. Der Nutzer wählt eine Ware aus und legt diese in den Warenkorb. Hierbei muss sich das Session Bean natürlich den Zustand des Warenkorbes merken. Somit ist der Lebenszyklus eines Stateful Session Beans komplizierter, da der EJB-Container beim nächsten Zugriff des Clients das richtige Bean übergeben muss.22 Abbildung 4 : Lebenszyklus eines Stateful Session Beans23 Eine weitere wichtige Eigenschaft, die im Rahmen dieser Arbeit von Bedeutung ist, ist die Fähigkeit eines Stateless Session Beans als Web Service zu dienen. Dies wird im Abschnitt 3.3 näher erläutert. 21 In Anlehnung an: Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 875. 22 Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 858. 23 In Anlehnung an: Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 874. 3 Verwendete Technologien 12 3.2.2 Entity Beans Entity Beans stellen die persistenten Daten einer Applikation dar. Dies bedeutet, dass sie auch nach einem Neustart des EJB-Containers vorhanden sein müssen. Die Persistenz kann theoretisch auf verschiedene Arten erreicht werden, wobei im praktischen Einsatz fast ausschließlich Datenbanken verwendet werden. Somit ist ein Entity Bean die Repräsentation einer Datenbanktabelle. Hier werden zwei Arten von Persistenz-Steuerung unterschieden. Entweder wird die Persistenz durch das Bean selbst verwirklicht, Bean Managed Persistence (BMP) genannt, oder sie wird durch den EJB-Container gesteuert, als Container Managed Persistence (CMP) bezeichnet.24 Entity Beans erlauben den gleichzeitigen Zugriff von mehreren Clients. Um den reibungslosen Ablauf dieser Zugriffe zu gewährleisten, ist es wichtig, dass die Entity Beans mit einem Transaktionsmechanismus ausgestattet sind. Dieser Mechanismus wird wiederum von dem EJB-Container bereitgestellt. Damit die Entity Beans von den Clients auffindbar sind, besitzt jedes Bean eine eindeutige Identifizierung. Der Lebenszyklus eines Entity Beans ist in Abbildung 5 dargestellt. Abbildung 5 : Lebenszyklus eines Entity Beans25 24 Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 859ff. 25 In Anlehnung an: Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 876. 3 Verwendete Technologien 13 3.2.3 Message-Driven Beans Ein Message-Driven Bean ist ein Enterprise Java Bean, welches J2EE-Applikationen die asynchrone Verarbeitung von Nachrichten erlaubt. So kann jede J2EE-Komponente, sei es ein Applikationsclient, ein anderes Enterprise Java Bean oder eine Web-Komponente, Nachrichten mit der JMS-API26 auf eine Warteschlange legen. Das Message-Driven Bean agiert dabei als eine Art Message Listener, ähnlich einem Event Listener, und hört die Warteschlange auf Nachrichten ab. Das Bean reagiert dann entsprechend, falls eine Nachricht auf der Warteschlange vorhanden ist.27 Dabei bilden die Message-Driven Beans eine Ausnahme unter den Enterprise Java Beans, denn sie werden nicht durch einen Client erzeugt und besitzen somit auch kein Home und Remote Interface. Da Message-Driven Beans keinen Status besitzen, haben sie einen ähnlichen Lebenszyklus wie die Stateless Session Beans (siehe Abbildung 3). 3.3 Web Services 3.3.1 Begriffsbestimmung und Funktionsweise Unter Web Services werden selbstbeschreibende, modulare Software-Komponenten verstanden, die dynamisch über Standard-Internettechnologien andere Komponenten im Web ausfindig machen und benutzen können, um so eine komplette, umfangreiche Aufgabe zu erfüllen.28 Im Gegensatz zu Anwendungen, die fest auf einem Rechner oder anderen ClientGeräten installiert werden, repräsentieren Web Services allgemein einen Geschäftsvorgang oder eine Systemfunktionalität, auf die über das Web zugegriffen werden kann. Konsumenten von Web Services können Personen sein, die auf den Service über einen Browser auf dem Rechner oder einem mobilen Endgerät zugreifen können, es können aber auch Anwendungsprogramme oder andere Web Services sein. 26 Sun Microsystems: Java Message Service, http://java.sun.com/products/jms/docs.html, 2002. 27 Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 864. 28 Schmelzer, R. et al.: XML and Web Services Unleashed, Sams Publishing, 2002, S. 592; Sun Microsystems: Sun Open Net Environment (Sun ONE), 2002, S. 4. 3 Verwendete Technologien 14 Web Services sind somit durch die folgenden Charaktereigenschaften gekennzeichnet:29 • Sie sind über das Web verfügbar. • Sie verfügen über eine Schnittstelle, die von anderen Programmen aufrufbar ist. • Sie sind registriert und daher lokalisierbar. • Sie kommunizieren mit Hilfe von Nachrichten über standardisierte Internetprotokolle. • Sie unterstützen lose gekoppelte (loosely coupled) Verbindungen zwischen Systemen, das heißt Kommunikationsprozesse zwischen Programmen. Für die Realisierung von Web Services hat sich allgemein die Verwendung der eXtensible Markup Language (XML) durchgesetzt, mit der die Schnittstellen der Web Services beschrieben und Nachrichten kodiert werden. Wichtig ist dabei vor allem, dass es bei XML-basierten Web Services keine Rolle spielt mit welcher Technologie sie erstellt wurden. Sie kommunizieren über Standard-Internetprotokolle (zum Beispiel TCP/IP, HTTP, HTTPS, SMTP) mit Hilfe ihrer XML-Schnittstellen und XML-Nachrichten, die alle Anwendungen verstehen können.30 Im Gegensatz zum monolitischen Implementierungsstil früherer Web-Applikationen basieren Web Services auf einer Reihe zusammenhängender Technologien: hierzu gehört insbesondere das XML-basierte Simple Object Access Protocol (SOAP)31, welches für die Kommunikation zwischen Dienstnutzer und Dienstanbieter zum Einsatz kommt. Mittels der Web Service Description Language (WSDL)32 lassen sich Web Services in einer einheitlichen, ebenfalls auf XML-basierten Sprache, beschreiben, die als Grundlage für die Registrierung von Web Services mittels der Universal Description, Discovery and Integration (UDDI)33 dient. 29 Sun Microsystems: Sun Open Net Environment (Sun ONE), 2002, S. 5; Kochmer, C.; Frandsen, E.: JSP and XML: Integrating XML and Web Services in Your JSP Application, Addison-Wesley, 2002, S. 75. 30 Sun Microsystems: Sun Open Net Environment (Sun ONE), 2002, S. 5; Clabby, J.: Web Services Explained: Solutions and Applications for the Real World, Prentice Hall, 2002, S. 24. 31 World Wide Web Consortium (W3C): SOAP 1.2 Specification, http://www.w3.org/TR/soap12-part1, 2003. 32 World Wide Web Consortium (W3C): Web Services Description Language (WSDL) 1.1, http://www.w3.org/TR/wsdl, 2001. 33 OASIS Open: UDDI Version 2 Specifications, http://www.oasis-open.org/committees/uddi- spec/doc/tcspecs.htm, 2002. 3 Verwendete Technologien 15 Die nachfolgende Abbildung 6 veranschaulicht den Zusammenhang zwischen diesen drei Technologien. Abbildung 6 : Zusammenhang zwischen UDDI, SOAP und WSDL34 Der Web Service-Anbieter legt zunächst die nach außen sichtbare Schnittstelle seines Services fest. Dies geschieht mit Hilfe der Web Services Description Language (WSDL). Anschließend kann der Dienst in einem Verzeichnis für Web Services veröffentlicht werden. Ein solcher Verzeichnisdienst wird von Universal Description, Discovery and Integration (UDDI) spezifiziert. Der Web Service-Nutzer kann UDDI verwenden, um nach einem bestimmten Service zu suchen und ihn in eigene Anwendungen zu integrieren. Die eigentlichen Aufrufe an den Web Service finden dann im Allgemeinen über das Simple Object Access Protocol (SOAP) statt.35 34 In Anlehnung an: Hein, G.; Lewis, J.: Web Services Basics: Separating Hype and Reality, in: Burton Group, Network Strategy, 2002, S. 24. 35 Kochmer, C.; Frandsen, E.: JSP and XML: Integrating XML and Web Services in Your JSP Application, Addison-Wesley, 2002, S. 79. 3 Verwendete Technologien 16 3.3.2 Web Services und J2EE Stateless Session Java Beans können in J2EE als Web Services zur Verfügung gestellt werden. Dies erfolgt durch einen JAX-RPC Endpoint und ermöglicht das Aufstellen von EJBApplikationen als Web Services.36 JAX-RPC37 steht für Java API for XML-based Remote Procedure Call. JAX-RPC ist eine Technologie zum Entwickeln von Web Services und Clients, die Remote Procedure Calls (RPC) und XML verwenden. Der RPC-Mechanismus wird oft als verteiltes Client-ServerModell eingesetzt und ermöglicht den Clients Funktionalitäten auf unterschiedlichen Systemen auszuführen. Ein Remote Procedure Call wird in JAX-RPC durch ein XML-basiertes Protokoll wie SOAP repräsentiert. Die SOAP-Spezifikation legt die Struktur, Kodierungsregeln und Konventionen für die Darstellung sowohl der Remote Procedure Calls (Aufrufe) als auch ihrer Antworten fest. Diese Aufrufe und Antworten werden in der Form von SOAP-Nachrichten (XML-Dateien) über HTTP transportiert. SOAP-Nachrichten sind zwar komplex, die JAX-RPC-API verbirgt jedoch diese Komplexität: SOAP-Nachrichten müssen nicht generiert oder analysiert werden, dieser Prozess wird vom JAX-RPC-System automatisch übernommen. Das System wandelt die API-Aufrufe in SOAP-Nachrichten und die Antworten aus SOAP-Nachrichten um.38 Die Definition einer JAX-RPC-API besteht aus zwei Teilen. Auf der Server-Seite werden die Remote Procedures durch das Definieren von Methoden in einer Java-Schnittstelle spezifiziert. Diese Methoden werden entsprechend in Klassen implementiert. Auf der Client-Seite erstellt das Client-Programm ein Proxy-Objekt (ein lokales Objekt, welches den Service repräsentiert) und ruft die Methoden dieses Proxy-Objekts auf.39 Bei der Verwendung von JAX-RPC kommt für Clients und Web Services der bereits in den Kapiteln 2.2.2 und 2.2.3 diskutierte Vorteil der Plattformunabhängigkeit der Java-Programmiersprache zum Tragen. Außerdem ist JAX-RPC nicht restriktiv: ein JAX-RPC-Client kann mit einem Web Service kommunizieren, der nicht auf einer Java-Plattform ausgeführt wird, 36 Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 319. 37 Sun Microsystems: Java API for XML-Based RPC, http://java.sun.com/webservices/jaxrpc, 2002. 38 Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 319. 39 Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004, S. 319. 3 Verwendete Technologien 17 und umgekehrt. Diese Flexibilität ist auf Grund der Verwendung von Standard-Technologien möglich: JAX-RPC benutzt vom World Wide Web Consortium (W3C) definierte Technologien wie HTTP, SOAP40 und Web Service Description Language (WSDL)41. 3.4 Applikationsserver Die Java System Application Server Platform Edition 8 unterstützt werkzeug-basiert die effektive Entwicklung und das schnelle Deployment von Anwendungen. Der Java-Applikationsserver ist lizenzfrei und kostenlos für Entwicklung und Wiederverwendung in Applikationen aus dem wissenschaftlichen Bereich. Die Sun Java Application Server Platform Edition 8 ist die erste vollständig kompatible Implementierung der J2EE 1.4 Plattform. Sie unterstützt zwei neue Technologien für die Entwicklung der Web-Schicht von auf der J2EE-Technologie basierenden Anwendungen: JavaServer Faces42, welche den Aufbau von Benutzerschnittstellen in Web-Applikationen vereinfachen, und die JavaServer Pages (JSP) Standard Tag Library (JSTL)43, welche Basisfunktionalitäten für auf JSP basierenden Anwendungen bündelt. Zusätzlich zu diesen neuen Features enthält die Applikationsserver-Lösung von Sun Microsystems eine skalierbare und zuverlässige J2EE-Applikationsplattform, die durch die folgenden Eigenschaften gekennzeichnet ist:44 40 World Wide Web Consortium (W3C): SOAP 1.2 Specification, http://www.w3.org/TR/soap12-part1, 2003. 41 World Wide Web Consortium (W3C): Web Services Description Language (WSDL) 1.1, http://www.w3.org/TR/wsdl, 2001. 42 Sun Microsystems: JavaServer Faces Technology, http://java.sun.com/javaee/javaserverfaces, 2003. 43 Sun Microsystems: JavaServer Pages Standard Tag Library, http://java.sun.com/products/jsp/jstl, 2003. 44 Sun Microsystems: J2EE v1.4 Documentation, http://java.sun.com/j2ee/1.4/docs/, 2004; Ramsey, L.: Java System Application Server Platform Edition 8, http://xml.coverpages.org/SunJavaSAServerJ2EE14.html, 2004. 3 Verwendete Technologien • 18 Vollständige Übereinstimmung mit dem J2EE-Standard: Web Services Interoperabilität ist gewährleistet durch die Unterstützung des WS-I45 Basisprofils. • Einen hoch-performanten Java Message Service (JMS)-Provider: für das Anbieten geschäftlicher Applikationsservices und Web Services. • Vollständige Web Services-Infrastruktur: enthält die Java API for XML Messaging (JAXM), Java API for XML Processing (JAXP), Java API for XML Registries (JAXR), Java API for XML-based RPC (JAX-RPC)46, SOAP und WSDL. • Unterstützung der neuen J2EE-Connector-Architektur: die bi-direktionale Connectivity für den Zugriff auf Geschäftsapplikationen unterstützt Standard-J2EEDeployment-APIs. Dadurch ist es möglich, den Applikationsserver mit Hilfe von Standard-Java-IDEs, wie beispielsweise NetBeans47, zu deployen. 45 Web Services Interoperability (WS-I): http://www.ws-i.org, 2002-2006. 46 Sun Microsystems: Web Service API Specifications, http://java.sun.com/webservices/reference/api/index.html, 2002-2006. 47 NetBeans: http://www.netbeans.org, 2006. 4 Zentrale Koordinationskomponente 19 4 Zentrale Koordinationskomponente 4.1 Aufbau und Architektur Die Zentrale Koordinationskomponente ist der Hauptbestandteil dieser Arbeit. Wie Middleware dient sie als Bindeglied zwischen den Clients und den Annotationsservern. Dabei dient die Zentrale Koordinationskomponente zur Lasten- und Dokumentenverteilung, ist webbasiert und ist unter Verwendung der in Kapitel 3 beschriebenen Technologien realisiert. Als Applikationsserver wird der Sun Java System Application Server Platform Edition 8 von Sun Microsystems eingesetzt (siehe Abschnitt 3.4). Das Framework beinhaltet somit Softwarekomponenten zur Kommunikation mit den Clients und den Annotationsservern, zur Datenhaltung und zur Lastenverteilung. Die Zentrale Koordinationskomponente, deren Aufbau und Architektur in Abbildung 7 verdeutlicht wird, besteht aus folgenden Komponenten: • Das AClientControllerBean ist ein Stateless Session Bean, das als Web Service interagiert und für die Kommunikation mit den Clients verantwortlich ist. • Als Message-Driven Bean verteilt das AMessageControllerBean die zu annotierenden Dokumente an die entsprechenden Annotationsservern. • Eine Warteschlange (Message-Queue) vom Typ Topic, die für den asynchronen Nachrichtenaustausch zwischen dem AClientControllerBean und dem AMessageControllerBean zuständig ist. • Das AServerControllerBean ist wiederum ein Stateless Session Bean, das als Web Service interagiert und für die Kommunikation mit den Annotationsservern verantwortlich ist. • Das AServerDataBean ist ein Entity Bean, mit dessen Hilfe die Eigenschaften der Annotationsserver in die Datenbank gespeichert werden. • Für die Datenhaltung der annotierten Dokumente ist das Entity Bean ADocumentDataBean verantwortlich. • Über die Datenbankschnittstelle können die Entity Beans mit der Datenbank interagieren. 4 Zentrale Koordinationskomponente 20 Abbildung 7 : Framework-Architektur 4.2 AClientControllerBean Das AClientControllerBean stellt als Web Service die Kommunikation des Clients mit dem Framework bereit. Dabei definiert AClientControllerIF als Web Service Endpoint Interface des Beans die Methoden, die aus der Clientsicht aufrufbar sind. Diese Bean-Methoden sind wiederum durch das AClientControllerBean implementiert. 4.2.1 Web Service Endpoint Interface AClientControllerIF ist das Web Service Endpoint Interface des Beans. Es stellt die Clientsicht auf den Web Service bereit und verbirgt das Stateless Session Bean gegenüber dem Client. Quelltext 1 zeigt die Definition der Schnittstelle AClientControllerIF. 4 Zentrale Koordinationskomponente 21 package de.mpg.mpisb.aframework.ejb.aclientcontroller; import java.rmi.RemoteException; import java.rmi.Remote; public interface AClientControllerIF extends Remote { public String getProjectId() throws RemoteException; public String[] getAnnotationTyps() throws RemoteException; public String addDocument(String p_id, String p_name, String p_content, String typ, String[] p_properties) throws RemoteException; public String[] getDocument(String p_id, String p_name) throws RemoteException; } Quelltext 1 : AClientControllerIF 4.2.2 Service-Implementierung Die Klasse AClientControllerBean implementiert die Methoden, die durch das Interface AClientControllerIF definiert werden. Die Methode getProjectId()gibt eine eindeutige Projekt-Id zurück, mit deren Hilfe der Client Dokumente zum Framework senden kann. Beim Aufruf der Methode getAnnotationsTyps() gibt der Web Service ein Array vom Typ String[] zurück, welches die Annotationswerkzeuge mit ihren Typen auflistet. Diese sind die Annotationstypen, mit deren Hilfe die Dokumente annotiert werden. Mit der Methode addDocument() wird das zu annotierende Dokument zum Framework gesendet. Hierbei werden die folgenden Daten als Parameter übergeben: die durch die Methode getProjectId()erhaltene Projekt-Id, der gewünschte Typ zum Annotieren, der Name und der Inhalt der Datei. Die Methode erzeugt aus diesen Parametern ein Datenhaltungsobjekt vom Typ ADocument. Dieses wird dann zur weiteren Verarbeitung als Nachricht auf eine Warteschlange (Message-Queue) vom Typ Topic (siehe Kapitel 4.3.1) gelegt. 4 Zentrale Koordinationskomponente 22 Durch dieses Vorgehen muss der Client nicht auf das annotierte Dokument warten, sondern kann sogleich ein weiteres Dokument zum Framework versenden oder andere Methoden aufrufen. Mit Hilfe der Methode getDocument() erhält der Client ein annotiertes Dokument vom Server zurück. Als Parameter werden die Projekt-Id und der Name des Dokumentes übergeben. Diese Methode ruft dann mit den Parametern die Finder-Methoden des Entity Beans ADocumentDataBean auf. Wird ein solches entsprechendes Entity Bean gefunden, so wird mit dessen Remote-Methoden das Ergebnis-Array gefüllt und an den Client zurückgegeben. Das Ergebnis-Array vom Typ String[] enthält die folgenden Informationen in der angegebenen Reihenfolge: • Projekt-Id • Name des Dokumentes • Originalinhalt des Dokumentes • Originalannotationen des Dokumentes • Das annotierte Dokument • Die gefundenen Annotationen • Die Art, auf die das Dokument annotiert wurde. 4.3 Message-Queue und AMessageControllerBean 4.3.1 Message-Queue Eine Warteschlange (Message-Queue) ist eine Implementierung der Schnittstelle Java Message Service (JMS)48 (siehe Kapitel 3.2.3). Sie ermöglicht den Austausch von Nachrichten (Senden und Empfangen) zwischen unterschiedlichen Clients, die in der Programmiersprache Java geschrieben sind. Bei der Warteschlange gibt es immer einen Abnehmer, der auf Nachrichten wartet und einen Anbieter (Provider), der diese Nachrichten bereitstellt. Dabei werden die Nachrichten in der 48 Sun Microsystems: Java Message Service, http://java.sun.com/products/jms/docs.html, 2002. 4 Zentrale Koordinationskomponente 23 selben Reihenfolge geliefert, in der sie gesendet wurden. Nachdem eine Nachricht empfangen und vom Abnehmer gelesen wird, wird sie von der Warteschlange entfernt. Es existieren zwei Arten von Warteschlangen: JMS-Queues und JMS-Topics. Der Unterschied zwischen denen ist der folgende: bei einer Queue werden alle Nachrichten vom Abnehmer (in diesem Falle ein Message-Driven Bean) gelesen und konsumiert. Im Gegensatz dazu werden bei einer Topic nur die Nachrichten gelesen, die zu einer bestimmten Kategorie gehören. Dies wird durch eine Topic (Überschrift) erreicht, die die Nachricht enthält. In dieser Arbeit wurde eine Warteschlange vom Typ Topic verwendet. Diese Technologie wurde wegen ihrer Flexibilität gewählt: sie könnte die Verwendung von kategorisierten Dokumenten bei zukünftigen Erweiterungen des implementierten Frameworks unterstützen. 4.3.2 AMessageControllerBean Das AMessageControllerBean ist ein Message-Driven Bean, das die Verteilung der einzelnen Dokumente an die Annotationsserver bewerkstelligt. Das Bean implementiert hierbei die von der J2EE-Spezifikation geforderte Methode onMessage(). Diese Methode wird automatisch aufgerufen, falls eine Nachricht auf die Warteschlange gelegt wurde. Das in der Nachricht gespeicherte Objekt vom Typ ADocument wird dabei ausgelesen. Mit dem in der Datenstruktur ADocument gespeicherten Annotationstyp wird nun die Finder-Methode findByAnnotationTyp() des Entity Beans AServerDataBean aufgerufen. Als Ergebnis erhält das AMessageControllerBean eine Auflistung der Annotationsserver, die diesen Annotationstyp unterstützen. Aus dieser Auflistung wird ein Annotationsserver per Zufall in der Gleichverteilung ausgewählt. Über die Remote-Methoden des Entity Beans AServerDataBean werden dann die entsprechenden Daten zum Aufbau einer Socket-Verbindung zum Annotationsserver gelesen. Nach dem erfolgreichen Etablieren einer Verbindung wird das zu annotierende Dokument über ein spezielles Protokoll an den Server gesendet. Quelltext 2 verdeutlicht den Aufbau des Protokolls. 4 Zentrale Koordinationskomponente ANNOTATOR:PUT 24 <Project-Id> <Name des Dokumentes> <Annotationstyp> <Inhalt des Dokumentes> Quelltext 2 : Protokoll zum Senden von Dokumenten 4.4 AServerControllerBean Das AServerControllerBean ist ähnlich wie das AClientControllerBean für die Kommunikation mit dem Framework verantwortlich. Der Unterschied besteht darin, dass das Bean, zusammen mit dem AMessageControllerBean, für die Integration der Backendsysteme, genauer der Annotationsserver, verantwortlich ist. Die Schnittstelle AServerControllerIF definiert als Web Service Endpoint Interface des Beans die Methoden, die aus der Clientsicht, in diesem Falle Annotationsserver-Sicht, aufrufbar sind. Diese Methoden werden durch das AServerControllerBean implementiert. 4.4.1 Web Service Endpoint Interface Die Schnittstelle AServerControllerIF ist das Web Service Endpoint Interface des Beans. Es stellt die Annotationsserver-Sicht auf den Web Service bereit und verbirgt das Stateless Session Bean gegenüber dem Annotationsserver. Quelltext 3 veranschaulicht die Schnittstelle AServerControllerIF. package de.mpg.mpisb.aframework.ejb.aservercontroller; import java.rmi.RemoteException; import java.rmi.Remote; public interface AServerControllerIF extends Remote { public String register(String p_name, int p_port, String[] p_typ, int p_corpussize) throws RemoteException; public String unregister(String p_name, int p_port) throws RemoteException; public String addDocument(String p_id, String p_name, String p_rstAnnots, String p_rstDoc, String p_srcAnnots, String p_srcDoc, String p_typ) throws RemoteException; } Quelltext 3 : AServerControllerIF 4 Zentrale Koordinationskomponente 25 4.4.2 Service-Implementierung Die Klasse AServerControllerBean implementiert die Methoden, welche durch die Schnittstelle AServerControllerIF definiert sind. Mit der Methode register() meldet sich der Annotationsserver am Framework an. Dabei übergibt er seine IP-Adresse (p_name), den Port, die verfügbaren Annotationstypen und die maximale Anzahl von Dokumenten, die er in einem Annotationsdurchgang annotieren kann. Beim Aufruf dieser Methode wird die Methode create() des Entity Beans AServerDataBean aufgerufen und somit ein neues Objekt diesen Typs mit den Parametern der Methode register()erzeugt. Die Methode unregister() wiederum meldet einen Annotationsserver vom Framework ab. Mit den Parametern dieser Methode wird die Finder-Methode findByServer() des Entity Beans AServerDataBean aufgerufen und das dadurch gefundene Objekt gelöscht. Um das Ergebnis einer Annotation an das Framework zu senden, benutzt der Annotationsserver die Methode addDocument(). Beim Aufruf dieser Methode wird mit deren Parametern wiederum die Methode create() des Entity Beans ADocumentDataBean aufgerufen und somit ein Objekt diesen Typs erzeugt. 4.5 AServerDataBean Das Enterprise Java Bean AServerDataBean ist ein Entity Bean, das einen Annotationsserver repräsentiert. Der Status dieses Beans ist in der Tabelle annotationserver einer relationalen Datenbank gespeichert. Die Datenbanktabelle annotationserver wurde mit der in Quelltext 4 dargestellten SQL-Anweisung erzeugt. 4 Zentrale Koordinationskomponente 26 CREATE TABLE `annotationserver` ( `id` int(10) unsigned NOT NULL default '0', `name` varchar(255) default NULL, `port` int(10) unsigned default NULL, `corpussize` int(10) unsigned default '10', `currentcorpussize` int(10) unsigned default '0' ) Quelltext 4 : SQL-Anweisung zum Anlegen der Tabelle annotationserver Wegen Nutzung der Bean Managed Persistence (siehe Kapitel 3.2.2), beinhaltet das Entity Bean alle SQL-Anweisungen zum Zugriff auf diese Datenbanktabelle. Das AServerDataBean implementiert zwei Schnittstellen: zum einen das Remote Interface AServerData, welches die Methoden zur Anwendungslogik des Beans enthält, und zum anderen das Home Interface AServerDataHome, welches die Methoden zur Erzeugung und zum Finden des Entity Beans bereitstellt. 4.5.1 Remote Interface Das Remote Interface AServerData definiert die Anwendungslogik des Entity Beans, auf die der Client zugreifen kann. Die Definition des Remote Interfaces wird im Quelltext 5 veranschaulicht. package de.mpg.mpisb.aframework.ejb.aserverdata; import java.rmi.RemoteException; import javax.ejb.EJBObject; public interface AServerData extends EJBObject { public String getName() throws RemoteException; public int getPort() throws RemoteException; public int getCorpusSize() throws RemoteException; public String[] getAnnotationsTyps() throws RemoteException; } Quelltext 5 : AServerData 4 Zentrale Koordinationskomponente 27 4.5.2 Home Interface Die Definitionen der Erzeugungs- und Finder-Methoden des Entity Beans sind im Home Interface AServerDataHome hinterlegt. Quelltext 6 verdeutlicht die zur Verfügung stehenden Schnittstellen-Methoden. package de.mpg.mpisb.aframework.ejb.aserverdata; import java.util.Collection; import java.rmi.RemoteException; import javax.ejb.*; public interface AServerDataHome extends EJBHome { public AServerData create(String p_server, int p_port, String[] p_types, int p_corpusSize) throws RemoteException, CreateException; public AServerData findByPrimaryKey(Integer p_id) throws FinderException, RemoteException; public Collection findByAnnotationTyp(String p_type) throws FinderException, RemoteException; public AServerData findByServer(String p_server, int p_port) throws FinderException, RemoteException; } Quelltext 6 : AServerDataHome 4.5.3 Bean-Implementierung Home Interface-Implementierung Wenn ein Client die Methode create() der Schnittstelle AServerDataHome aufruft, wird der EJB-Container veranlasst die korrespondierende Methode ejbCreate() des AServerDataBean auszuführen. Diese Methode fügt mit einer SQL-INSERT-Anweisung die mit den Parametern übergebenen Daten in die Datenbank ein. Der Aufruf wird erfolgreich mit der Rückgabe des entsprechenden Remote Interfaces an den Client beendet. Die Finder-Methoden erlauben es einem Client die Entity Beans zu finden. Zu diesem Zweck kann der Client folgende drei Methoden benutzen: 4 Zentrale Koordinationskomponente • findByPrimaryKey() • findByAnnotationTyp() • findByServer(). 28 Für jede dieser Methoden implementiert das AServerDataBean die entsprechenden Methoden mit dem Präfix ejbFind. Beispielsweise wird die zu findByServer() korrespondierende Methode ejbFindByServer() genannt. Quelltext 7 veranschaulicht die Bean-Implementierung der Methode ejbFindByPrimaryKey(). public Integer ejbFindByPrimaryKey(Integer primaryKey) throws FinderException { boolean result; try { result = selectByPrimaryKey(primaryKey); } catch (Exception ex) { throw new EJBException("ejbFindByPrimaryKey: " + ex.getMessage()); } if (result) { return primaryKey; } else { throw new ObjectNotFoundException("Row for id " + primaryKey + " not found."); } } Quelltext 7 : AServerDataBean.ejbFindByPrimaryKey() Auf dem ersten Blick scheint diese Methode inkorrekt zu sein, da sie statt eines Objekts vom Typ AServerData ein Objekt vom Typ Integer zurückgibt. An dieser Stelle muss jedoch berücksichtigt werden, dass der Client lediglich die Methode findByPrimaryKey() der Home-Schnittstelle ausführt und der EJB-Container die entsprechende Methode ejbFindByPrimaryKey(). 4 Zentrale Koordinationskomponente 29 Die Schnittstelle AServerDataHome erbt von der Basisschnittstelle EJBHome weitere Methoden, die vom AServerDataBean implementiert werden müssen. Diese Methoden dienen zum Speichern, Laden und Löschen des Entity Beans. Tabelle 1 veranschaulicht das Zusammenspiel dieser Methoden und der entsprechenden Datenbank-Operationen. Methode ejbCreate() ejbFindByPrimaryKey() ejbFindByAnnotationTyp() ejbFindByServer() ejbLoad() ejbRemove() ejbStore() SQL-Anweisung INSERT SELECT SELECT SELECT SELECT DELETE UPDATE Tabelle 1 : SQL-Anweisungen im AServerDataBean Remote Interface-Implementierung Durch die Implementierung der Methoden der Remote-Schnittstelle AServerData erhält das Entity Bean seine Anwendungslogik. Die Methoden führen keine Datenbankabfragen aus, womit sichergestellt ist, dass die Anwendungslogik von der Datenbankprogrammierung getrennt ist. Die Methoden getName() und getPort() übergeben dem Client die IP-Adresse und den Port des Annotationsservers, auf welchem dieser die zu annotierenden Dokumente erhalten kann. Beim Aufruf von getCorpusSize() wird die maximale Anzahl der Dokumente zurückgegeben, die der Server in einem Annotationsdurchgang annotieren kann. Mit der Methode getAnnotationsTyps() erhält der Client ein Array vom Typ String[] mit den Annotationstypen, die der Annotationsserver zur Verfügung stellt. 4.6 ADocumentDataBean Das Enterprise Java Bean ADocumentDataBean ist ein Entity Bean, das ein annotiertes Dokument repräsentiert. Der Status dieses Beans ist in der Tabelle annotations einer relationalen Datenbank gespeichert. Die Datenbanktabelle annotations wurde mit der in Quelltext 8 veranschaulichten SQL-Anweisung erzeugt. 4 Zentrale Koordinationskomponente 30 CREATE TABLE `annotations` ( `id` int(11) unsigned NOT NULL default '0', `projectid` varchar(255) default NULL, `name` varchar(255) default NULL, `srcdoc` longtext, `srcannots` longtext, `rstdoc` longtext, `rstannots` longtext, `typ` varchar(255) default NULL ) Quelltext 8 : SQL-Anweisung zum Anlegen der Tabelle annotations Auch hier beinhaltet das Entity Bean wegen Nutzung der Bean Managed Persistence (siehe Kapitel 3.2.2) alle SQL-Anweisungen zum Zugriff auf diese Datenbanktabelle. Das ADocumentDataBean implementiert zwei Schnittstellen: das Remote Interface ADocumentData und das Home Interface ADocumentDataHome. Die Schnittstelle ADocumentData enthält die Methoden zur Anwendungslogik des Beans, während ADocumentDataHome die Methoden zur Erzeugung und zum Finden des Entity Beans bereitstellt. 4.6.1 Remote Interface Das Remote Interface ADocumentData definiert die Anwendungslogik des Entity Beans, auf welche der Client zugreifen kann. Quelltext 9 stellt die Definition des Remote Interfaces dar. 4 Zentrale Koordinationskomponente 31 package de.mpg.mpisb.aframework.ejb.adocumentdata; import java.rmi.RemoteException; import javax.ejb.EJBObject; public interface ADocumentData extends EJBObject { public String getProjectId() throws RemoteException; public String getName() throws RemoteException; public String getSourceDocument() throws RemoteException; public String getSourceAnnotations() throws RemoteException; public String getResultDocument() throws RemoteException; public String getResultAnnotations() throws RemoteException; public String getAnnotationTyp() throws RemoteException; } Quelltext 9 : ADocumentData 4.6.2 Home Interface Die Definitionen der Erzeugungs- und Finder-Methoden des Entity Beans sind im Home Interface ADocumentDataHome hinterlegt. Quelltext 10 verdeutlicht die zur Verfügung stehenden Schnittstellen-Methoden. 4 Zentrale Koordinationskomponente 32 package de.mpg.mpisb.aframework.ejb.adocumentdata; import java.rmi.RemoteException; import javax.ejb.*; public interface ADocumentDataHome extends EJBHome { public ADocumentData create(String p_projectId, String p_name, String p_srcDoc, String p_srcAnnots, String p_rstDoc, String p_rstAnnots, String p_type) throws RemoteException, CreateException; public ADocumentData findByPrimaryKey(Integer p_id) throws FinderException, RemoteException; public ADocumentData findByName(String p_projectId, String p_name) throws FinderException, RemoteException; } Quelltext 10 : ADocumentDataHome 4.6.3 Bean-Implementierung Home Interface-Implementierung Wenn ein Client die Methode create() der Schnittstelle ADocumentDataHome aufruft, wird der EJB-Container veranlasst die korrespondierende Methode ejbCreate() des ADocumentDataBean auszuführen. Diese Methode fügt mit einer SQL-INSERT-Anweisung die mit den Parametern übergebenen Daten in die Datenbank ein. Der Aufruf wird erfolgreich mit der Rückgabe des entsprechenden Remote Interfaces an den Client beendet. Die Finder-Methoden erlauben es einem Client die Entity Beans zu finden. Der Client kann hierzu die folgenden zwei Methoden benutzen: • findByPrimaryKey() • findByName(). Für jede dieser Methoden implementiert das ADocumentDataBean die entsprechenden Methoden mit dem Präfix ejbFind. Beispielsweise wird die zu findByName() korres- 4 Zentrale Koordinationskomponente 33 pondierende Methode ejbFindByName() genannt. Quelltext 11 veranschaulicht die BeanImplementierung der Methode ejbFindByName(). public Integer ejbFindByName(String p_projectId, String p_name) throws FinderException { Integer result; try { result = selectByName(p_projectId, p_name); } catch (Exception ex) { throw new EJBException("ejbFindInRange: " + ex.getMessage()); } return result; } Quelltext 11 : ADocumentDataBean.ejbFindByName() Die Schnittstelle ADocumentDataHome erbt von der Basisschnittstelle EJBHome weitere Methoden, die vom ADocumentDataBean implementiert werden müssen. Ähnlich wie bei dem AServerDataBean dienen diese Methoden zum Speichern, Laden und Löschen des Entity Beans (siehe Kapitel 4.5.3). Tabelle 2 veranschaulicht das Zusammenspiel dieser Methoden und der entsprechenden Datenbank-Operationen. Methode ejbCreate() ejbFindByPrimaryKey() ejbFindByName() ejbLoad() ejbRemove() ejbStore() SQL-Anweisung INSERT SELECT SELECT SELECT DELETE UPDATE Tabelle 2 : SQL-Anweisungen im ADocumentDataBean Remote Interface-Implementierung Durch die Implementierung der Methoden der Remote-Schnittstelle ADocumentData erhält das Entity Bean seine Anwendungslogik. Die Methoden führen keine Datenbankabfragen aus, womit die Trennung der Anwendungslogik von der Datenbankprogrammierung gewährleistet ist. 4 Zentrale Koordinationskomponente 34 Die Methoden getProjectId() und getName() übergeben dem Client die Projekt-Id und den Dateinamen des annotierten Dokumentes. Beim Aufruf der Methoden getSourceDocument() und getResultDocument() werden einmal der Originalinhalt und einmal der annotierte Inhalt des Dokumentes zurückgegeben. Mit den Methoden getResultAnnotations() und getSourceAnnotations() erhält der Client die Annotationen mit Angaben zur Position im Dokumententext und Worttyp (Person, Datum usw.). Schließlich gibt die Methode getAnnotationTyp() den Annotationstyp zurück, mit dem das Dokument annotiert wurde. 4.7 Datenbank-Schnittstelle Für die Speicherung der Daten benutzt das Annotations-Framework eine relationale Datenbank. Als Datenbankserver wird MySql49 in der Version 4.1 eingesetzt. Grundsätzlich werden Datenbanken mit Hilfe ihrer JDBC-Treiber angesprochen. Mit einem JDBC-Treiber wird eine Verbindung (Connection Pool) aufgebaut, der ein entsprechender JNDI-Name zugewiesen wird. Eine als Connection Pool gespeicherte Verbindung kann ausgewählt werden und ihr kann eine virtuelle Datenbank zugeordnet werden. Dabei ist eine virtuelle Datenbank ein Datenbank-Objekt, welches einen JNDI-Namen besitzt. Über diesen JNDI-Namen können alle J2EE-Serverkomponenten Zugriff auf die Datenbank erhalten. 49 MySql: http://www.mysql.com, 2006. 4 Zentrale Koordinationskomponente 35 Durch die Verwendung von Connection Pools ist ein einfacher Wechsel zu unterschiedlichen Datenbanken gewährleistet. So wurde am Anfang dieser Arbeit die mit dem J2EE-Applikationsserver mitgelieferte Datenbank Pointbase50 benutzt. Aus lizenzrechtlichen Gründen war jedoch ein Austausch notwendig. Als zu verwendende Datenbank wurde MySql gewählt. Der Wechsel verlief reibungslos: der entsprechende Datenbanktreiber wurde installiert, ein neuer Connection Pool wurde generiert (siehe oben) und dieser der virtuellen Datenbank zugewiesen. Nach diesem Vorgehen konnte die MySql-Datenbank direkt eingesetzt werden. 50 Pointbase: http://www.pointbase.com, 2006. 5 Beispiel-Implementierung eines Clients 36 5 Beispiel-Implementierung eines Clients Die Beispiel-Implementierung eines Clients soll die Möglichkeiten eines Web Service-Clients verdeutlichen. Der Web Service-Client ist mit der JAX-RPC-API als Dynamic Proxy Client realisiert. Damit der Client mit dem Framework kommunizieren kann, muss er eine Verbindung zur Web Service-Schnittestelle des Session Beans AClientControllerBean aufbauen. Über diese Verbindung kann dann der Client die Methoden getProjectId(), getAnnotationsTyps(), addDocument() und getDocument() aufrufen (siehe Abschnitt 4.2.2). Um die Verbindung mit dem Web Service aufzubauen, erzeugt der Client einen Dynamic Proxy wie im Folgenden beschrieben. Zuerst wird ein Objekt vom Typ Service erzeugt, welches Quelltext 12 verdeutlicht. Ein Service Objekt ist ein Entwurfsmuster für Proxies. Um das Service Objekt zu erzeugen, wird die Methode createService() eines weiteren Entwurfmusters vom Typ ServiceFactory aufgerufen. ServiceFactory serviceFactory = ServiceFactory.newInstance(); Service helloService = serviceFactory.createService(p_url, new QName(nameSpaceUri, serviceName)); Quelltext 12 : Dynamic Proxy Generierung Teil 1 Die Methode hat zwei Parameter: die URL der WSDL-Datei und ein QName Objekt. Mit Hilfe der WSDL-Datei erhält der Client Informationen über den Web Service. Sie wird beim Kompilieren des Web Services erzeugt. Diese URL wird in einem serialisierten AConfig Objekt des Clients abgespeichert. Abbildung 8 zeigt den Java Swing Dialog zum Ändern der URL an. 5 Beispiel-Implementierung eines Clients 37 Abbildung 8 : Dialog Konfiguration Ein Objekt vom Typ QName ist ein Tupel, welches einen XML–konformen Namen repräsentiert. Das Tupel besteht aus einer Namespace URI und den lokalen Teil des Namens. Der lokale Servicename ist hierbei AClientController (siehe Quelltext 12). Anschließend generiert der Client einen Proxy (myProxy) mit dem Typ der Web Service Endpoint-Schnittstelle (AClientControllerIF): de.mpg.mpisb.aclient.webservice.AClientControllerIF myProxy = (de.mpg.mpisb.aclient.webservice.AClientControllerIF) helloService.getPort(new QName(nameSpaceUri, portName), de.mpg.mpisb.aclient.webservice.AClientControllerIF.class); Quelltext 13 : Dynamic Proxy Generierung Teil 2 Das Objekt helloService ist ein Entwurfsmuster für dynamische Proxies. Um myProxy zu erzeugen, ruft das Programm die Methode getPort() auf. Diese Methode besitzt zwei Parameter: ein QName Objekt, das den Port-Namen spezifiziert, und ein java.lang.Class Objekt für das Service Endpoint Interface. Diese Klasse wird mit dem Werkzeug wscompile und der WSDL-Datei des Web Services erzeugt. Der Port-Name (portName) ist wiederum in der WSDL-Datei spezifiziert. 5 Beispiel-Implementierung eines Clients 38 Mit dieser Proxy-Verbindung kann nun der Client die Methoden des Web Services aufrufen, die in der Web Service-Schnittstelle definiert sind. Quelltext 14 zeigt am Beispiel der Methode getProjectId()den vollständigen Aufruf einer Web Service-Methode. public String getProjectId(URL p_url) { String result = null; try { ServiceFactory serviceFactory = ServiceFactory.newInstance(); Service helloService = serviceFactory.createService(p_url, new QName(nameSpaceUri, serviceName)); de.mpg.mpisb.aclient.webservice.AClientControllerIF myProxy = (de.mpg.mpisb.aclient.webservice.AClientControllerIF) helloService.getPort(new QName(nameSpaceUri, portName), (de.mpg.mpisb.aclient.webservice.AClientControllerIF.class); result = myProxy.getProjectId(); } catch (Exception ex) { ex.printStackTrace(); } return result; } Quelltext 14 : Clientaufruf von getProjectId() Zusätzlich zu der Grundfunktionalität mit einem Web Service interagieren zu können, besitzt der Client eine Benutzeroberfläche (siehe Abbildung 9), mit der diese Funktionalität gesteuert wird. Mit der leicht-bedienbaren Benutzeroberfläche können die verschiedenen Client-Funktionalitäten aufgerufen werden. Zu diesem Zweck bietet die Benutzeroberfläche zwei Registerkarten: für das Senden und für das Empfangen von Dokumenten (siehe Abbildung 9). Die Dokumente können mit Hilfe eines Datei-Auswahl-Dialogs bezüglich ihrer Projekt-Id zusammengestellt werden. Über die Registerkarte „Senden“ können die Dokumente an das Framework gesendet werden, während über die Registerkarte „Empfangen“ die gesendeten Projekte ausgewählt und empfangen werden können. Dabei werden die Dateien in das Verzeichnis abgespeichert, das im Konfigurationsdialog eingestellt ist (siehe Abbildung 8). 5 Beispiel-Implementierung eines Clients 39 Die Benutzeroberfläche wurde mit eigenen Modifikationen auf Basis der Bibliotheken jlooks und jforms51 erstellt. Abbildung 9 : Benutzeroberfläche AClient 51 JGOODIES Java User Interface Design: http://www.jgoodies.com, 2003-2006. 6 Kommunikation 40 6 Kommunikation In diesem Kapitel werden die Kommunikationsabläufe des Frameworks beschrieben, welche bei einem erfolgreichen Annotationsvorgang stattfinden. Damit das Framework seine Aufgabe, das Annotieren von Dokumenten, erfüllen kann, muss sich mindestens ein Annotationsserver als Backendsystem am Framework registriert haben. Zu diesem Zweck ruft der Annotationsserver die Web Service-Schnittstelle des Session Beans AServerControllerBean auf und meldet sich mit deren Methode register()an. Das AServerControllerBean schreibt anschließend über das Entity Bean AServerDataBean die Anmeldedaten in die Datenbank. Hat sich ein Annotationsserver am Framework angemeldet, kann ein Client, wie er zum Beispiel in Kapitel 5 implementiert wurde, eine Projekt-Id und eine Auflistung der vom Framework bereitgestellten Annotationstools anfordern. Dazu ruft er die Methoden getProjectId() und die getAnnotationsTyps()der Web Service-Schnittstelle des Session Beans AClientControllerBean auf. Nun kann der Client mit der Methode addDocument()und den entsprechenden Parametern Dokumente zum Annotieren an das Framework senden. Wurde das Dokument an das Framework erfolgreich übertragen, so sendet des AClientControllerBean eine Nachricht mit den Dokumentendaten an die Topic-Warteschlange. Die Topic-Warteschlange wird von dem AMessageControllerBean abgehört. Falls die Warteschlange eine Nachricht für das AMessageControllerBean enthält, wird dessen Methode onMessage() ausgeführt. Beim Ausführen der Methode besorgt sich das Bean über das AServerDataBean die Daten eines Annotationsservers aus der Datenbank, mit dem das Dokument annotiert werden kann. Mit diesen Daten kann eine Socket-Verbindung aufgebaut werden. Über diese Verbindung wird, mit dem in Abschnitt 4.3.2 beschriebenen Protokoll, das Dokument an den Annotationsserver verschickt. Hat ein Annotationsserver ein Dokument annotiert, so sendet er wiederum über die Web Service-Schnittstelle des Session Beans AServerControllerBean das annotierte Dokument an das Framework zurück. Dazu wird die Methode addDocument()aufgerufen, die dann die erhaltenen Daten über das ADocumentDataBean in die Datenbank speichert. 6 Kommunikation 41 Möchte nun der Client sein vorher gesendetes Dokument wieder bekommen, so ruft er über die Web Service-Schnittstelle des Session Beans AClientControllerBean die Methode getDocument()auf. Diese erhält die entsprechenden Dokumentendaten mit Hilfe des Entity Beans ADocumentDataBean von der Datenbank und gibt diese Daten an den Client zurück. Soll ein Annotationsserver von dem Framework abgemeldet werden, so wird dies über die Methode unregister() der Web Service-Schnittstelle des Session Beans AServerControllerBean erledigt. Die Methode löscht beim Aufruf die entsprechenden Daten über das AServerDataBean aus der Datenbank. Somit stehen dieser Annotationsserver und dessen Annotationswerkzeuge dem Framework nicht mehr zur Verfügung. 7 Evaluation 42 7 Evaluation Um die Leistung des Frameworks beurteilen zu können, wurde das Framework mitsamt angeschlossenen Client und Annotationsservern getestet. Im folgenden Kapitel wird der Versuchsaufbau beschrieben und die Ergebnisse der durchgeführten Lastentests dargestellt und beurteilt. 7.1 Versuchsaufbau Der J2EE-Applikationsserver von Sun Microsystems und der Client wurden auf einem Personal PC von Dell mit dem Microsoft XP Betriebssystem installiert. Die Annotationsserver wurden auf dem Linux Cluster des Max Plank Instituts für Informatik (MPI) betrieben. Die folgende Tabelle 3 gibt einen Überblick über die technischen Spezifikationen der Systeme. Betriebssystem CPU Hauptspeicher System Client und J2EE-Server Microsoft Windows XP Professional Intel Pentium 4, 3.0 GHz 1 GB System Annotationsserver Debian Linux 2 * AMD Opteron, 2.4 GHz 8 GB Tabelle 3 : Technische Spezifikation Versuchsaufbau Als Dokumentenbasis für das verteilte Annotieren dienten 2627 XML-Dokumente aus dem Wikipedia-Verzeichnis. Durch die Verteilung der Dokumente in 5 verschiedene Größenklassen kann von einer heterogenen Dokumentenbasis bezüglich der Größe gesprochen werden (siehe Abbildung 10). Hierbei war das kleinste 444 Bytes und das größte Dokument 104,69 Kilobytes groß. Die durchschnittliche Größe betrug 4,54 Kilobytes. 7 Evaluation 43 Abbildung 10 : Dokumentenverteilung 7.2 Lastentest Beim Lastentest wurden drei Hauptdurchgänge durchgeführt. Dabei wurde zweimal mit dem ANNIE-Annotationswerkzeug annotiert und zwar einmal mit einer Korpusgröße von 25 Dokumenten und einmal mit einer Korpusgröße von 50 Dokumenten. Des Weiteren wurde einmal mit Minorthird annotiert, jedoch nur mit einer Korpusgröße von 25 Dokumenten. Durch den hohen Speicherverbrauch und dem damit verbundenen Programmabsturz von Minorthird, war ein weiterer Durchgang mit einer Korpusgröße von 50 Dokumenten nicht möglich. Dieser Fall trat auch bei ANNIE auf, jedoch erst bei einer Korpusgröße von circa 100 Dokumenten. Jeder dieser einzelnen Durchgänge wurde insgesamt fünfmal durchgeführt. So wurde jeder Durchgang jeweils mit einem, zwei, drei, vier und acht an das Framework angemeldeten Annotationsservern bewerkstelligt. Insgesamt wurden somit 15 Annotationsvorgänge mit den 2627 Dokumenten ausgeführt. Zum Senden der XML-Dokumente an das Framework brauchte der Client im Durchschnitt 151 Sekunden und zum Empfangen der annotierten Dokumente 412 Sekunden. Der Zeitunterschied ist durch das höhere Datenaufkommen des Ergebnis-Arrays der Methode getDocument() (siehe Abschnitt 4.2.2) zu erklären. 7 Evaluation 44 Das Framework brauchte wiederum 153 Sekunden um die XML-Dokumente an die einzelnen Annotationsserver zu versenden. Beim ersten Testdurchlauf mit ANNIE und einer Korpusgröße von 25 Dokumenten brauchte das Framework für die 2627 XML-Dokumente 1508 Sekunden, um diese zu annotieren. Dieser Durchlauf wurde wie oben beschrieben mit einer unterschiedlichen Anzahl von Annotationsservern wiederholt. Dabei wurde bei jedem Durchgang eine signifikante Performance-Verbesserung festgestellt. Der zweite Testdurchlauf mit einer Korpusgröße von 50 Dokumenten ergab ein ähnliches Bild bezüglich der Performance. Jedoch mit zwei Ausnahmen: der Performance-Zuwachs auf Grund der erhöhten Korpusgröße war marginal und beim Ausführen des Tests mit acht Annotationsservern wurde festgestellt, dass die Performance-Messungen schlechtere Werte ergaben, als bei einem Test mit vier Annotationsservern. Die genauen Zeiten der beiden Testdurchläufe sind aus der Tabelle 4 und Abbildung 11 ersichtlich. Anzahl ANNIE 25 Server Zeit in sec 1 2 3 4 8 ANNIE 50 Zeit in sec 1508 763 501 388 279 Minorthird 25 Zeit in sec 1399 708 478 378 460 7712 2082 1688 954 624 Tabelle 4 : Annotationszeiten Die Ursache dieses Ergebnisses war schnell gefunden. Durch die hohe Korpusgröße warteten die Annotationsserver zu lange, bis sie den Annotationsvorgang starten konnten. Der Grund dafür war, dass das Framework eine nicht ausreichend hohe Durchsatzrate garantieren konnte. Somit wurde der Dokumentenkorpus nicht ausreichend schnell mit Dokumenten gefüllt. Dieses Ergebnis verdeutlicht, dass der Zusammenhang zwischen Korpusgröße und Anzahl der verwendeten Annotationsserver eine große Rolle spielt. Bei den Tests hat sich eine Korpusgröße von 25 Dokumenten und acht Annotationsservern als am praktikabelsten erwiesen. 7 Evaluation 45 Die Testdurchläufe mit Minorthird waren weniger zufrieden stellend. Die Laufzeit war im Vergleich zu den ANNIE-Durchläufen zu hoch. Auch die Qualität und Zuverlässigkeit der Annotationen sind als unzureichend zu bewerten52. Tabelle 4 zeigt die genauen Laufzeiten der Durchläufe mit Minorthird. Abbildung 11 : Annotationszeiten im Vergleich 52 Fuchs, D.: Verteilte Annotation von Dokumenten – Entwurf und Implementierung eines modularen Annotationsservers auf Basis von NLP-Technologien, Universität des Saarlandes, 2006. 8 Zusammenfassung und Ausblick 46 8 Zusammenfassung und Ausblick Die Bereitstellung von Ontologien im World Wide Web wird durch das Annotieren von Dokumenten durch NLP-Software-Werkzeuge wie ANNIE oder Minorthird ermöglicht. Diese Werkzeuge sind allerdings ausschließlich als Einzelplatzlösungen konzipiert und sind dadurch nicht in der Lage, die große Anzahl zu annotierender Dokumente webbasiert zu unterstützen. Dies ist jedoch einer der wichtigsten Schritte in der Entwicklung zum Semantischen Web. Dafür werden flexible und skalierbare Lösungen (Frameworks) benötigt, die die enorme Rechenlast entsprechend verteilen können und unterschiedlichen Annotationstools anbinden können. Im Mittelpunkt dieser Arbeit steht der Architekturentwurf und Implementierung eines Frameworks auf J2EE-Basis, das die Integration unterschiedlicher Annotationstools ermöglicht. Dazu wurde im ersten Teil der Arbeit das Umfeld des Frameworks erläutert und verschiedene Umsetzungsalternativen bewertet. Als Architekturmodell wurde die J2EE-Spezifikation wegen ihrer zahlreichen Vorteile und insbesondere ihrer Plattformunabhängigkeit gewählt. Anschließend wurden die verwendeten Technologien (J2EE, Enterprise Java Beans, Web Services) beschrieben. Auf Basis dieser Technologien wurden die Hauptbestandteile dieser Arbeit und ihre Funktionsweisen dargestellt: die Zentrale Koordinationskomponente, ihre Teilkomponenten sowie die Beispiel-Implementierung eines Framework-Clients. Des Weiteren wurde die Kommunikation und das Zusammenspiel zwischen der Zentralen Koordinationskomponente, den Clients und den Annotationsservern vorgestellt. Die durchgeführten Lastentests haben die erwünschten Ergebnisse bezüglich der Rechenlastverteilung bestätigt. Das implementierte Framework ist in der Lage die verteilte Annotation von einer großen Anzahl von Dokumenten zu unterstützen und dabei heterogene Annotationstools zu integrieren. Die Performance der Gesamtlösung ist als gut zu bewerten. Jedoch hängt das Ergebnis stark vom eingesetzten Annotationswerkzeug ab. Zusätzlich ist der Zusammenhang zwischen Korpusgröße und Anzahl der verwendeten Annotationsserver zu berücksichtigen. Basierend auf dieser Arbeit können zukünftige Erweiterungen entwickelt werden. Zurzeit werden die annotierten Dokumente per Zufall in der Gleichverteilung zu den Annotationsservern gesendet. Das führt dazu, dass es eine gewisse Zeit in Anspruch nimmt bis der 8 Zusammenfassung und Ausblick 47 Annotationsvorgang gestartet werden kann. Aus diesem Grund wäre eine denkbare Erweiterung des Frameworks, die Dokumente nicht gleichverteilt, sondern nach der eingestellten Korpusgröße zu priorisieren. Dazu müsste eine Funktionalität den Annotationsservern zur Verfügung gestellt werden, mit Hilfe derer sie ihre Auslastung dem Framework mitteilen können (Rückkopplungskanal). Das Framework müsste dann bestimmte Ausweichstrategien umsetzen, um eine bessere Auslastung der Annotationsserver zu gewährleisten und dadurch eine weitere Performance-Verbesserung zu ermöglichen. A Installation 48 A Installation Die folgende Installationsanweisung bezieht sich auf die Systemspezifikationen des Versuchsaufbaus (siehe Abschnitt 7.1) und hat als Ergebnis ein lauffähiges System zum Testen des Versuchsaufbaus. Die Anleitung enthält somit auch die Installationsanweisung der Annotationsserver.53 Für die Installation auf anderen Systemen ist insbesondere auf die entsprechende Anpassung der build-Skripte zu achten. Alle Komponenten des Frameworks liegen in kompilierter Form vor. Ist eine Neukompilation erwünscht, so kann dies, ohne Anpassung der build-Dateien, nur mit einer vollständigen J2SE- und J2EE-Installation erfolgen. Um zu Kompilieren gehen Sie in das entsprechende Verzeichnis der Komponente (z.B.: server\AServer) und rufen Sie dort asant build auf. Um nach einem Neukompilieren von AFrameWork die entsprechende EAR-Datei zu aktualisieren, müssen die Dateien mit dem Deploytool aktualisiert und die Komponente auf dem J2EE-Server redeployt werden. A.1 Framework Für die Installation und Konfiguration des Frameworks ist es wichtig, folgende Schritte in der angegebenen Reihenfolge auszuführen: 1. Installieren Sie das Java SDK 1.4.2.10, welches sich auf der Installations-CD im Verzeichnis install\j2se befindet, da der Sun Applikationsserver nur mit dieser Version ausgeführt werden kann. 2. Installieren Sie den Sun Applikationsserver, welcher sich auf der Installations-CD imVerzeichnis install\j2ee befindet und folgen Sie den Anweisungen auf dem Bildschirm. 53 Fuchs, D.: Verteilte Annotation von Dokumenten – Entwurf und Implementierung eines modularen Annotationsservers auf Basis von NLP-Technologien, Universität des Saarlandes, 2006. A Installation 49 3. Installieren Sie den MySql-Datenbankserver in der Version 4.1 aus dem Verzeichnis install\database. Es wird empfohlen, die Programme im Verzeichnis install\database\tools zu installieren. 4. Installieren Sie die Datenbank auf dem Datenbankserver, indem Sie die SQL-Anweisungen in install\database\dbannotar.sql auf dem Datenbankserver ausführen. 5. Installieren Sie den Datenbanktreiber von MySql für den Applikationsserver, indem Sie die Datei im mysql-connector-java-3.1.8a.zip install\database entpacken und mysql-connector-java-3.1.8-bin.jar die darin Datei in Verzeichnis enthaltene das Datei lib\endorsed Verzeichnis des Applikationsservers kopieren. Für die Konfiguration des Frameworks gehen Sie nach folgenden Schritten vor: 6. Starten Sie den Applikationsserver mit Start>Programme>Sun Microsystems>j2ee 1.4sdk>start default domain. 7. Starten Sie die Adminoberfläche mit Start>Programme>Sun Microsystems>j2ee 1.4sdk>admin console und loggen Sie sich als Applikationsserver-Administrator ein. 8. Geben Sie unter Applications Server>JVM Settings>Path Settings bei Classpath Suffix den Pfad zum dem in Punkt 5 installierten Datenbanktreiber an (z.B.: C:\Sun\AppServer\lib\endorsed\mysql-connector-java-3.1.8bin.jar). 9. Erstellen Sie unter JDBC>Connection Pools eine neue Connection mit dem Namen MySqlPool und Resource Type javax.sql.DataSource. Klicken Sie auf „Next“ und geben Sie unter Data Source com.mysql.jdbc.jdbc2.optional.MysqlDataSource Class Name ein. Klicken Sie nun wieder auf „Next“. Löschen Sie unter „Properties“ alle Eigenschaften, fügen Sie dafür die folgende Eigenschaften ein und beenden Sie die Eingabe mit „Finish“: Name user password serverName port databaseName Wert <Benutzername Datenbank> <Kennwort Datenbank> localhost 3306 annotator A Installation 50 10. Erstellen Sie nun unter JDBC>Resources eine neue JDBC-Resource mit JNDI-Name jdbc/dbannotator und wählen Sie als Pool-Namen MySqlPool aus. 11. Erstellen Sie unter Java Message Service>Connection Factories zweimal eine JMS Connection Factory: eine mit dem JNDI-Namen jms/DurableTopicConnectionFactory und eine mit dem JNDI-Namen Bei jms/TopicConnectionFactory. javax.jms.TopicConnectionFactory beiden muss ausgewählt als Typ werden. Die jms/DurableTopicConnectionFactory bekommt unter „Eigenschaften“ als Namen ClientId und als Wert MyId eingetragen. 12. Unter Java Message Service>Destination Resources erstellen Sie eine neue JMS Destination Resource mit JNDI-Namen jms/Topic und Typ javax.jms.Topic. Fügen Sie unter „Eigenschaften“ als Namen Name und als Wert PhysicalTopic ein. 13. Fügen Sie unter Java Message Service>Physical Destinations eine Physical Destination PhysicalTopic mit dem Typ topic ein. 14. Stoppen und starten Sie den Applikationsserver dann wieder. Wir kommen nun zum Deployen des Frameworks in den Applikationsserver: 1. Kopieren Sie das Verzeichnis framework auf den Rechner. 2. Starten Sie das Deploytool unter Start>Programme>Sun Microsystems>j2ee 1.4sdk>Deploytool. 3. Öffnen Sie mit dem Deploytool die Datei framework\AFrameWork\AFrameWorkApp.ear und geben Sie der Applikation den Namen AFrameWorkApp. 4. Deployen Sie nun diese Applikation. A.2 Client Um den Client zu installieren, kopieren Sie das Verzeichnis client auf den Rechner und ändern Sie die Datei build.properties, die sich im Verzeichnis client\common befindet, wie folgt: A Installation 51 1. j2ee.home muss auf den Pfad zum Applikationsserver angepasst werden. 2. aclient.home muss auf das Verzeichnis client\AClient gesetzt werden. Zum Starten des Clients öffnen Sie die Eingabeaufforderung und wechseln Sie zum Verzeichnis client\AClient. Rufen Sie dort asant run auf. Ist der Client gestartet, sollten Sie die Konfiguration mit Hilfe des Konfigurationsdialogs ändern. Dieses Vorgehen funktioniert nur, wenn der Client und der Applikationsserver auf dem selben Rechner installiert sind. Sollte der Client auf einem eigenen Rechner installiert werden, so ist das J2SE SDK zu installieren und die Bibliotheken der J2EE auf den Clientrechner zu kopieren. Diese Bibliotheken und die Bibliothek client\AClient\dist\client.jar müssen im classpath für den Client angegeben sein. Der Client wird dann mit dem folgenden Befehl gestartet: java –classpath <HIER CLASSPATH> de.mpg.mpisb.aclient.AClient. A.3 Annotationsserver54 Um den Annotationsserver zu installieren, gehen Sie wie folgt vor: 1. Kopieren Sie das Verzeichnis server von der CD auf den Rechner. 2. Installieren Sie GATE aus dem server\gate Verzeichnis. Minorthird wurde schon beim Kopieren im Schritt 1 installiert. 3. Im Startskript start.sh müssen die Variablen MINORTHIRD, PATH und JAVA_HOME angepasst werden. Des Weiteren muss beim java-Aufruf die Eigenschaft gate.home angepasst werden. Zum Starten führen Sie das Startskript im Verzeichnis server\AServer aus und passen wiederum die Konfiguration mit Hilfe des Konfigurationsdialogs an. 54 Fuchs, D.: Verteilte Annotation von Dokumenten – Entwurf und Implementierung eines modularen Annotationsservers auf Basis von NLP-Technologien, Universität des Saarlandes, 2006. B Abbildungsverzeichnis 52 B Abbildungsverzeichnis Abbildung 1 : Überblick Framework ......................................................................................... 6 Abbildung 2 : Mehrschichtige Anwendungen ........................................................................... 8 Abbildung 3 : Lebenszyklus eines Stateless Session Beans .................................................... 11 Abbildung 4 : Lebenszyklus eines Stateful Session Beans ...................................................... 11 Abbildung 5 : Lebenszyklus eines Entity Beans...................................................................... 12 Abbildung 6 : Zusammenhang zwischen UDDI, SOAP und WSDL....................................... 15 Abbildung 7 : Framework-Architektur .................................................................................... 20 Abbildung 8 : Dialog Konfiguration ........................................................................................ 37 Abbildung 9 : Benutzeroberfläche AClient.............................................................................. 39 Abbildung 10 : Dokumentenverteilung.................................................................................... 43 Abbildung 11 : Annotationszeiten im Vergleich...................................................................... 45 C Tabellenverzeichnis 53 C Tabellenverzeichnis Tabelle 1 : SQL-Anweisungen im AServerDataBean.............................................................. 29 Tabelle 2 : SQL-Anweisungen im ADocumentDataBean ...................................................... 33 Tabelle 3 : Technische Spezifikation Versuchsaufbau ............................................................ 42 Tabelle 4 : Annotationszeiten................................................................................................... 44 D Quelltextverzeichnis 54 D Quelltextverzeichnis Quelltext 1 : AClientControllerIF ............................................................................................ 21 Quelltext 2 : Protokoll zum Senden von Dokumenten............................................................. 24 Quelltext 3 : AServerControllerIF............................................................................................ 24 Quelltext 4 : SQL-Anweisung zum Anlegen der Tabelle annotationserver............................. 26 Quelltext 5 : AServerData ........................................................................................................ 26 Quelltext 6 : AServerDataHome .............................................................................................. 27 Quelltext 7 : AServerDataBean.ejbFindByPrimaryKey()........................................................ 28 Quelltext 8 : SQL-Anweisung zum Anlegen der Tabelle annotations..................................... 30 Quelltext 9 : ADocumentData.................................................................................................. 31 Quelltext 10 : ADocumentDataHome ..................................................................................... 32 Quelltext 11 : ADocumentDataBean.ejbFindByName() ......................................................... 33 Quelltext 12 : Dynamic Proxy Generierung Teil 1 .................................................................. 36 Quelltext 13 : Dynamic Proxy Generierung Teil 2 .................................................................. 37 Quelltext 14 : Clientaufruf von getProjectId() ........................................................................ 38 E Literaturverzeichnis 55 E Literaturverzeichnis 4. Armstrong, E. et al.: The J2EE 1.4 Tutorial, Sun Microsystems, 2004. 5. Backschat, M.: Enterprise Java Beans, Spektrum Akademischer Verlag, 2002. 6. Berners-Lee, T.; Hendler, J.; Lassila, O.: The Semantic Web, Scientific American, Mai 2001. 7. Clabby, J.: Web Services Explained: Solutions and Applications for the Real World, Prentice Hall, 2002. 8. Cohen, W.: Minorthird: Methods for Identifying Names and Ontological Relations in Text using Heuristics for Inducing Regularities from Data, http://minorthird.sourceforge.net, 2004. 9. Cunningham, H. et al.: Developing Language Processing Components with GATE (a User’s Guide), University of Sheffield, 2001-2006. 10. Fuchs, D.: Verteilte Annotation von Dokumenten – Entwurf und Implementierung eines modularen Annotationsservers auf Basis von NLP-Technologien, Universität des Saarlandes, 2006. 11. Hein, G.; Lewis, J.: Web Services Basics: Separating Hype and Reality, in: Burton Group, Network Strategy, 2002. 12. JGOODIES Java User Interface Design: http://www.jgoodies.com, 2003-2006. 13. Kochmer, C.; Frandsen, E.: JSP and XML: Integrating XML and Web Services in Your JSP Application, Addison-Wesley, 2002. 14. Microsoft Corporation: .NET Framework 1.0, http://msdn.microsoft.com/netframework/previous/v1.0/default.aspx, 2002. 15. Microsoft Corporation: Common Language Infrastructure Standards, http://msdn.microsoft.com/netframework/ecma/, 2002-2006. 16. MySql: http://www.mysql.com, 2006. 17. NetBeans: http://www.netbeans.org, 2006. 18. OASIS Open: UDDI Version 2 Specifications, http://www.oasisopen.org/committees/uddi-spec/doc/tcspecs.htm, 2002. 19. Pointbase: http://www.pointbase.com, 2006. 20. Ramsey, L.: Java System Application Server Platform Edition 8, http://xml.coverpages.org/SunJavaSAServerJ2EE14.html, 2004. 21. Schmelzer, R. et al.: XML and Web Services Unleashed, Sams Publishing, 2002. E Literaturverzeichnis 56 22. Sun Microsystems: Java API for XML-Based RPC, http://java.sun.com/webservices/jaxrpc, 2002. 23. Sun Microsystems: Java Naming and Directory Interface (JNDI), http://java.sun.com/products/jndi/, 2002. 24. Sun Microsystems: Java Message Service, http://java.sun.com/products/jms/docs.html, 2002. 25. Sun Microsystems: Sun Open Net Environment (Sun ONE), 2002. 26. Sun Microsystems: Web Service API Specifications, http://java.sun.com/webservices/reference/api/index.html, 2002-2006. 27. Sun Microsystems: JavaServer Faces Technology, http://java.sun.com/javaee/javaserverfaces, 2003. 28. Sun Microsystems: JavaServer Pages Standard Tag Library, http://java.sun.com/products/jsp/jstl, 2003. 29. Sun Microsystems: Enterprise JavaBeans Specification 2.1, http://java.sun.com/products/ejb/docs.html, 2004. 30. Sun Microsystems: J2EE Platform Specification 1.4, http://java.sun.com/j2ee/j2ee-1_4-frspec.pdf, 2004. 31. Sun Microsystems: J2EE v1.4 Documentation, http://java.sun.com/j2ee/1.4/docs/, 2004. 32. Thielscher, J.: J2EE und .NET zwei konkurrierende Standards?, Computer Zeitung, Mai 2002. 33. Web Services Interoperability (WS-I): http://www.ws-i.org, 2002-2006. 34. World Wide Web Consortium (W3C): Web Services Description Language (WSDL) 1.1, http://www.w3.org/TR/wsdl, 2001. 35. World Wide Web Consortium (W3C): SOAP 1.2 Specification, http://www.w3.org/TR/soap12-part1, 2003. 36. Younis, S.: J2EE vs. .NET An Executive Look, 2003.