Erstellen Sie einen Datenzugriffs-Web Service für plattformübergreifenden Datenaustausch
von Dean Amo
Übersetzer Übersetzt und für den deutschsprachigen Markt überarbeitet von Mathias Spateneder
Wir zeigen Ihnen hier an einem Beispiel, wie Sie mit frei verfügbaren Open-Source-Tools schnell und einfach eine kommerzielle Web Service-Anwendung erstellen. Unser Web Service ist nicht schwierig, aber Sie benötigen Grundkenntnisse in der QShell-Navigation. Auch Anwender des Web Service müssen wissen, wie ein Web Service von ihrer Plattform aus aufgerufen wird, und sie müssen über SQL-Kenntnisse verfügen, um über den Service Datenbankabfragen auf dem Zielsystem ausführen zu können. Den Quellcode zu unserem Beispiel finden Sie unter www.newsolutions.de.
Über unser Beispiel
Wir wollen einen Datenzugriffs-Web Service für plattformübergreifenden Datenaustausch aufbauen. Open-Source Software bietet kostenlose Unterstützung bei der Herausgabe von Web Services, aber auf der iSeries gibt es auch andere Möglichkeiten zum Erstellen von Web Services und es kommen ständig neue dazu. Das IBM WebSphere Development Studio ist eine dieser Optionen: Es enthält Wizards, mit denen Sie Ihre Java-Klassen in einen Web Service umwandeln. Auch Sun Microsystems brachte erst kürzlich ein eigenes Entwicklungs-Toolkit für Web Services heraus. Wir verwenden für unser Beispiel zwei Open-Source Produkte der Apache Software Foundation: Tomcat und Axis. Tomcat ist als Servlet Container und Java Server Page (JSP) Engine eine kostenlose Alternative zu IBMs WebSphere. Wie die Standard-Edition von WebSphere unterstützt Tomcat keine Enterprise Java Beans.
Wenn Sie Interesse an Open-Source Software mit EJB-Funktionalität haben, suchen Sie am besten auf dem JBoss Application Server unter www.jboss.org. Axis bietet eine Oberfläche für Hosted Web Services und hat erst kürzlich das Beta-Stadium verlassen. Das erste Release läuft in unserer Beispielanwendung zufriedenstellend, weil die Ein-/Ausgabe unseres Web Service auf einen einfachen Objekt-/Datentyp beschränkt ist: den String. Unser Beispiel-Web Service ist eine einfache, generische Datenzugriffs-Klasse, die eine übergebene SQL-Anweisung ausführt und das Ergebnis in einem von zwei möglichen Formaten zurückgibt (abhängig von der aufgerufenen Methode). Die Methoden der Klasse sind runSQLReturnDS und runSQLReturnXML. Wie die Namen andeuten, führen beide Methoden SQL-Anweisungen aus, wobei die erste das Ergebnis in einem String mit Trennzeichen zurückgibt und die andere im XML-Format. Nur ein Parameter, eine SQL-Anweisung, muss an den Service übergeben werden. Die Datenbanksicherheit wird von Service selbst abgehandelt. In unserem Beispiel fehlen einige wichtige Features, die Sie jedoch nutzen sollten, wie z.B. Skalierung (Database Connection Pooling) und Anwendungssicherheit. Zur Gewährleistung der Anwendungssicherheit können Sie den Service so modifizieren, dass er Parameter für Benutzer und Kennwort annimmt. Vielleicht sollten Sie auch das Thema Sicherheitsstandards für Web Services angehen, zu dem Secure Socket Layer (SSL) zum Verschlüsseln der Verbindung und digitale Zertifikate zum Authentifizieren beider Parteien einer Transaktion gehören. Beachten Sie, dass der hier vorgestellte Service für den Einsatz in einem privaten Netz konzipiert ist. Er ist nützlich zum Ausgeben von iSeries-Daten auf einem PC-basierten Web Server , der außerhalb einer Firewall vielleicht gefährdet wäre. Sie könnten den Code auch verwenden, um Informationen allgemein verfügbar zu machen, aber jede proprietäre Anwendung erfordert zusätzliche Sicherheit.
| Januar Utility der NEWSolutions | |
| load´n´go | |
Anforderungen
Zum Ausführen der Anwendung benötigen Sie das Java Development Toolkit, Version 1.3 oder höher, und den QShell-Interpreter. Wenn Sie das JDK 1.5 einsetzen, müssen Sie eventuell einige Pakete verschieben. Details dazu finden Sie in der Dokumentation von Axis. Um optimale Ergebnisse zu erzielen, sollten auch das letzte kumulative PTF und das aktuelle JAVA-Gruppen-PTF installiert sein. Abbildung 1 zeigt die empfohlenen Gruppen-PTFs, die Sie benötigen, um diesen Anforderungen zu genügen. Sicherheitshalber sollten Sie sich aber bei IBM über den aktuellen PTF-Stand informieren. Einfachheitshalber benutzen wir den Lightweight-HTTP-Server, der in der Apache Tomcat Distribution enthalten ist. Sie können Axis aber auch mit dem IBM HTTP-Server (powered by Apache) einsetzen, der Tomcat verwendet, um Servlets und JSPs anbieten zu können. Dies ist die bessere Wahl, wenn Sie vorhaben, eine große Anzahl von Webseiten auf derselben Box anzubieten. Zusätzlich benötigen Sie die binären Distributionen von Apache Tomcat, Release 4.1.18 und Apache Axis, Release 1.0, die Sie unter www.apache.org finden können. Tomcat ist unter dem Jakarta-Link zu finden und Axis unter dem XML-Link. Laden Sie die Zip-Versionen dieser Distributionen herunter.

Nachdem alle Software-Voraussetzungen erfüllt sind, kann die schrittweise Installation beginnen:
Step 1: Standalone Apache Tomcat installieren
Die aktuellste Version von Tomcat (bei Drucklegung dieses Artikels) ist 4.1.29. Sie unterstützt die Servlet 2.3 und JSP 1.2 Spezifikationen. Laden Sie sich die aktuellste Distribution von der Apache-Website auf Ihren PC herunter. Als nächstes laden Sie das Paket auf Ihre iSeries und speichern es im IFS. Wenn Sie nicht wissen, wie man Dateien von einem PC auf die iSeries übertragen kann, verwenden Sie die Windows-Befehlszeilenversion von FTP:
- Um FTP von der Befehlseingabe aus zu benutzen, wählen Sie im Startmenü die Option Ausführen und geben folgendes ein:
FTP Hostname
Für Hostname setzen Sie den Namen oder die IP-Adresse Ihrer iSeries ein. - Melden Sie sich an, indem Sie die Eingabeaufforderungen für den Benutzernamen und das Kennwort beantworten.
- Übertragen Sie die Datei mit dem Befehl Put, wobei Sie Quell- und Zielverzeichnis folgendermaßen angeben: put
<PC-Quellverzeichnis\Datei> <iSeries-Zielverzeichnis\Datei>Beispiel:
put c:\download\jakarta-tomcat-4.1.29.zip \tmp\jakarta-tomcat-4.1.29.zip - Nach der Übertragung geben Sie den Befehl Quit ein, um die FTP-Sitzung zu beenden. Nachdem die Datei mit der Distribution auf die iSeries übertragen wurde, können Sie daran gehen, das Paket zu extrahieren. Starten Sue dazu mit dem Befehl QSH eine QShell-Sitzung, und gehen Sie in das Verzeichnis, in dem Sie die Tomcat-Distribution gespeichert haben. Extrahieren Sie die Dateien mit Hilfe des Java-Utilities jar aus dem Zip-Archiv:
jar xf jakarta-tomcat-4.1.29.zip
Sobald das Dollarzeichen ($) der Befehlseingabe erscheint, ist die Extraktion abgeschlossen. Verschieben Sie jetzt das Verzeichnis an seinen endgültigen Speicherort. Das Verzeichnis hat einen langen Namen. Wenn Sie es umbenennen möchten, ist jetzt der richtige Zeitpunkt dafür. Zum Verschieben und Umbenennen von Verzeichnissen verwenden Sie den Unix-Befehl mv:
mv jakarta-tomcat-4.1.29.zip [Zielverzeichnis (z.B. /tomcat)]Ich habe das Verzeichnis Tomcat im Root-Verzeichnis des IFS gespeichert, um den Java-Klassenpfad und andere Umgebungsvariablen (über die Sie gleich mehr erfahren) möglichst kurz zu halten. Das Zip-Archiv kann jetzt übrigens gelöscht werden. Als nächstes müssen die Java-Klassen von Tomcat für den Betrieb auf der iSeries optimiert werden. Der Optimierungsprozess kann mehrere Stunden dauern. Verwenden Sie den folgenden QShell-Befehl um die gesamte Verzeichnisstruktur von Tomcat zu durchlaufen und alle darin enthaltenen Java-Archivdateien (JAR) mit dem Befehl CRTJVAPGM (Java-Programm erstellen) zu optimieren:
for jar in $(find /[Tomcat-Verzeichnis] -name "*.jar"); do system "CRTJVAPGM CLSF('"$jar"') OPTIMIZE(40)"; done - Der letzte Schritt der Installation ist das Erstellen von individuellen Start- und Shutdown-Scripts, die die Umgebungsvariablen für die Ausführung von Tomcat auf der iSeries initialisieren. Öffnen Sie dazu das Script strtomcat.sh (Abbildung 2) mit einem Texteditor, und ersetzen Sie die Pfadangabe von CATALINA_HOME durch den Pfad, den Sie zuvor für Tomcat gewählt haben. Abhängig von der auf Ihrem System installierten JDK-Version müssen Sie eventuell noch die Pfadangabe in der Variable JAVA_HOME ändern. Danach ändern Sie die Pfadangaben im Shutdown-Script (Abbildung 3) entsprechend den Änderungen, die Sie im Start-Script vorgenommen haben. Kopieren Sie die angepaßten Scripts in das bin-Verzeichnis Ihrer Tomcat-Installation. Um die Installation zu testen, wechseln Sie in das bin-Verzeichnis Ihrer Tomcat-Installation. Rufen Sie das Start-Script auf, indem Sie strtomcat.sh in die Befehlseingabezeile von QShell eingeben. Tomcat wird gestartet, und es erscheinen mehrere Statusnachrichten, von denen eine lauten sollte: „Starting service Tomcat-Standalone Apache Tomcat/4.1.29.“ (Je nach Leistungsfähigkeit Ihres Systems kann es einige Minuten dauern, bis der Server vollständig gestartet ist.) Öffnen Sie einen Browser, und geben Sie die folgende Adresse ein, wobei Sie die IP-Adresse oder den Netzwerknamen Ihrer iSeries in die URL einfügen:
http://[IP oder Name Ihrer iSeries]:8080/index.jsp
Wenn alles gut gegangen ist, sollte daraufhin die Einführungs-Seite von Tomcat in Ihrem browser erscheinen (Abbildung 4). Wie Sie weiter oben sehen können, ist für Tomcat standardmäßig Port 8080 festgelegt. Hinweise zum Ändern des Ports finden Sie in der Dokumentation.
Step 2: Apache Axis installieren
Die Installation von Apache Axis läuft ähnlich ab wie die Installation von Tomcat. Als erstes laden Sie sich die aktuelle Distribution von der Apache-Website auf Ihren PC herunter. Dann übertragen Sie das heruntergeladene Paket mit FTP oder einem anderen, Ihnen vertrauten Verfahren auf die iSeries. Auch diese Distribution muss mit dem Java-Utility jar extrahiert werden. Nach dem Entpacken läuft Axis als Web-Anwendung innerhalb Tomcat. Nach der Installation sollte ein Unterverzeichnis webapps im Axis-Verzeichnis zu finden sein. Dieses Unterverzeichnis müsste ein weiteres mit der Bezeichnung axis enthalten. Verschieben Sie dieses Verzeichnis mit Hilfe des Befehls mv in das webapps-Verzeichnis von Tomcat. Ihre Tomcat-Verzeichnisstruktur sollte jetzt der in Abbildung 5 dargestellten ähnlich sehen. Als nächstes optimieren Sie die Axis-Klassen für die Ausführung auf der iSeries. Dazu verwenden Sie dieselbe Befehls-Schleife wie bei der Installation von Tomcat, geben aber das Axis-Verzeichnis als Startpunkt an:
for jar in $(find /[Axis-Verzeichnis]
-name "*.jar");
do system "CRTJVAPGM CLSF('"$jar"')
OPTIMIZE(40)"; done
Danach starten Sie wieder den Browser und geben folgende Adresse ein, um zu überprüfen, ob Axis korrekt ausgeführt wird:
http://[IP oder Name Ihrer iSeries]:8080/axis
Jetzt müsste die Verwaltungs-Seite von Axis in Ihrem Browser erscheinen. Für unsere Anwendung müssen Sie die Funktion von Axis genauer kennen, deshalb gehen wir gleich weiter zur Installation des Beispiel-Services.
Step 3: Den Web-Service installieren
Das meiste haben Sie schon geschafft, und die letzte Aufgabe – die Installation des Web-Service – ist die einfachste. Sie speichern einfach den Java-Quellcode in einem Verzeichnis. Kompilieren ist nicht erforderlich. Im Quellcode ändern Sie die Variablen für Benutzer-ID und Kennwort in der Klasse für Ihr System. Ändern Sie die Dateierweiterung von .java in .jws, und verschieben Sie die Datei in das Verzeichnis axis, das Sie im webapps-Verzeichnis von Tomcat angelegt haben.
Step 4: Den Service testen
Der Service kann von vielen Plattformen und Sprachen aufgerufen werden, die wir hier nicht im einzelnen aufzählen können. Axis enthält einige Java-Beispiele für das Aufrufen von Webservices wie dem von uns erstellten. Zum Testen unserer Installation rufen Sie den Web-Service von einem Browser aus auf, und fordern Sie die Übertragung der WSDL-Datei (Web Service Description Language) an, die eine detaillierte Beschreibung zum Aufrufen des Service enthält. Dazu adressieren Sie mit dem Browser einfach die iSeries, die als Zielsystem konfiguriert wurde und übergeben einen leeren WDSL URL-Parameter an den Service:
http://[IP oder Name Ihrer iSeries]:8080/ axis/DBWebService.jws?WDSL
Axis empfängt den Aufruf des Services und generiert die WSDL. Der Entwickler kann sich auf die Business-Logik kümmern anstatt sich mit Details von Webservices herumschlagen zu müssem. Client-Anwendungen verwenden die WSDL zum Aufrufen des Webservices. Um z.B. mit Microsoft’s .NET-Plattform eine Verbindung zu unserem Service herzustellen, müssen Sie nur einen Verweis auf die oben dargestellte WSDL-URL erstellen. Der .NET-Compiler liest die WSDL und erlaubt Ihnen, das gewünschte Objekt zu instantiieren und zu verwenden, als ob es auf dem lokalen System gespeichert wäre.
Plattformübergreifendes Potential
Wie Sie an diesem Beispiel sehen können, bieten Web-Services weitreichende, plattformübergreifende Möglichkeiten. Bisher waren vergleichbare Funktionen nur mit schwer und unter beträchtlichem Zeitaufwand mit Hilfe proprietärer Techniken zu realisieren. Die enorme Vereinfachung ermutigt jetzt hoffentlich Entwickler dazu, verschiedene Sprachen und Plattformen einzusetzen, vorhandenen Code gemeinsam zu nutzen und effiziente, breit angelegte Anwendungen zu schaffen. Ich setze übrigens eine komplexere Version dieses Services produktiv ein, und finde Sie sehr nützlich für Anwendungen aller Art. Nachdem ich Sicherheitsfunktionen und Pools für Datenbank-Verbindungen realisiert hatte, habe ich noch die Methoden runSQL, runRPGReturnXML und runRPGReturnDS hinzugefügt. Die Parameter werden in Form von XML an den Java-Webservice übergeben, der dann das angegebene RPG-Programm aufruft. Das ist jedoch nur eine Richtung von vielen, in der die Möglichkeiten unseres Web-Service erweitert werden können. Also machen Sie sich ans Werk, und erstellen Sie einen Web-Service.



