Apache Axis Projektgruppe Peer2Peer Suche nach Webservices WS 2004/SS 2005 Benjamin Bayer Betriebssysteme und Verteilte Systeme Inhalt 4 Kurzer Überblick über Web Services und SOAP 4 Axis im Überblick 4 Erstellung eines Web Service 4 Implementierung eines Clients 4 Axis und WSDL 4 WSDL2Java, Java2WSDL 4 Architektur 4 Aufbau von Axis, Handler 4 Typ-Mapping, Scoping 4 TCPMonitor 4 Zusammenfassung 4PG P2P: Apache Axis 2 Web Services 4 Ein Web Service ist ein Dienst im Internet, der unter einer bestimmten URI erreichbar ist 4 Web Services sind Dienste für Anwendungen 4 Kommunikation erfolgt über SOAP-Nachrichten 4 SOAP ist Plattform-und programmiersprachenunabhängig 4 Protokollunabhängig; Versendung über HTTP, FTP, … 4 Datenaustausch zwischen Anwendungen, die in verschiedenen Programmiersprachen geschrieben sind -> Interoperabilität 4 Grundlage sind folgende Standards: 4 SOAP, WSDL, UDDI 4PG P2P: Apache Axis 3 Axis 4 Axis ist ein Toolkit zur Erstellung von Web Services 4 Java-Framework zur Erstellung von Servern, Clients, Gateways 4 Es gibt auch eine C++ - Version, die aber noch nicht so ausgereift ist 4 Es wird unter Lizenz der Apache Software Foundation entwickelt 4 Nachfolger von Apache SOAP 4 Apache Soap selber basiert auf SOAP4J, das von IBM Ende 2000 entwickelt wurde 4 Wichtigste Verbesserungen gegenüber Apache SOAP: 4 Geschwindigkeit: SAX statt DOM-Parser 4 Flexibilität: Dank der überarbeiteten Architektur lässt sich Axis fast beliebig erweitern 4 Transportunabhängigkeit: Axis kann Nachrichten über HTTP, FTP, SMTP übertragen 4PG P2P: Apache Axis 4 Axis braucht einen Server 4 Axis benötigt einen Server, z.B. Tomcat 4 Web-Anwendung in Form von drei Servlets 4 Axis Servlet: 4Nimmt Web-Services auf und routet Anfragen an diese weiter 4 AdminServlet: 4Einrichten und Entfernen von Services 4 SOAP Monitor Servlet: 4Anzeige der ein- und ausgehenden SOAP-Nachrichten 4PG P2P: Apache Axis 5 Webservice erstellen 4 Deployment eines Services am Beispiel EchoService public class EchoService { public String Echo (String s) { return "Erhalten: " + s; } } 4PG P2P: Apache Axis 6 Web Service erstellen 4 Instant Deployment: 4 EchoService.java nach <webapp-root>\axis kopieren 4 EchoService.java nach EchoService.jws umbenennen 4 Service erreichbar unter 4http://localhost:8080/axis/EchoService.jws 4 Datei wird bei Anfrage automatisch gefunden und kompiliert 4 Nachteile 4 Man benötigt den Sourcecode 4 Keine Konfigurationsmöglichkeiten 4 Keine Verwendung von Java-Paketen möglich 4 Nur für einfache Web Services 4PG P2P: Apache Axis 7 Web Service erstellen 4 Custom Deployment: Deploying mittels Deployment Descriptor 4 Beispiel: <deployment xmlns="http://xml.apache.org/axis/wsdd xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name=“EchoService" provider="java:RPC"> <parameter name="className" value=“EchoService"/> <parameter name="allowedMethods" value=“*"/> </service> </deployment> deploy.wsdd 4PG P2P: Apache Axis 8 Web Service erstellen 4 Deploying mit AdminClient 4Port 8080 Standard, sonst mit -p <port> angeben 4URL: http://localhost:8080/axis/services/EchoService 4 Web Service wird wieder entfernen: <undeployment xmlns="http://xml.apache.org/axis/wsdd/"> <service name="EchoService"/> </undeployment> 4PG P2P: Apache Axis 9 Client mit Axis 4 Implementierung eines Clients am Beispiel EchoService 4 URI: http://localhost:8080/axis/services/EchoService 4 Bietet eine Methode „Echo“ an 4Bekommt einen String-Parameter übergeben und gibt String zurück 4 Drei Klassen benötigt: 4 import javax.xml.namespace.QName; 4 import org.apache.axis.client.Call; 4 import org.apache.axis.client.Service; 4PG P2P: Apache Axis 10 Client mit Axis 4 Serviceobjekt erzeugen, welches ein Call-Objekt zurückgibt: 4 Service service = new Service(); 4 Call call = (Call)service.createCall(); 4 Call-Objekt erhält alle Informationen für Methodenaufruf 4 String Endpoint = "http://localhost:8080/axis/services/EchoService“; 4 call.setTargetEndpointAddress(new java.net.URL(Endpoint)); 4 call.setOperationName(new QName(“EchoService",“Echo")); 4 Aufrufen der Methode Echo 4 String ret = (String) call.invoke(new Object[] {"Hallo"}); 4PG P2P: Apache Axis 11 „Untyped“ Server 4 Vom Server erzeugte Antwort: 4 Typ des zurückgegebenen Parameter ist normalerweise angegeben, kann aber auch fehlen <ns1:echoStringResponse xmlns:ns1="http://soapinterop.org/"> <result xsi:type="xsd:string" >Hello!</result> </ns1:echoStringResponse> 4 Lösung: Typ explizit angeben 4 call.setReturnType( org.apache.axis.Constants.XSD_STRING ); 4 call.setReturnClass(String.class); 4PG P2P: Apache Axis 12 Parameter benennen 4 Übergebene Parameter werden durchnummeriert 4 Soap-Nachricht: <soapenv:Body> … <ns1:arg0 xsi:type="soapenc:string" xmlns:soapenc= "http://schemas.xmlsoap.org/soap/encoding/">Hallo</ns1:arg0> </ns1:Echo> … </soapenv:Body> 4PG P2P: Apache Axis 13 Parameter benennen 4 Parameternamen angeben: 4 call.addParameter(„StringParam", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN); 4 call.setReturnType( org.apache.axis.Constants.XSD_STRING ); <soapenv:Body> … <ns1:“StringParam“ xsi:type="soapenc:string" "http://schemas.xmlsoap.org/soap/ encoding/">Hallo</ns1:“StringParam“> </ns1:Echo> … </soapenv:Body> 4PG P2P: Apache Axis xmlns:soapenc= 14 Axis und WSDL 4 WSDL – Web Service Description Language 4 Maschinenlesbare Beschreibung eines Web Services 4 Informationen über den Ort eines Service, aufrufbare Methoden sowie Rückgabewerte und Parameter dieser Methoden 4 auf welche Weise unterstützt Axis WSDL: 4 Automatische WSDL-Generierung für installierte Services 4 WSDL2Java: Codegenerierung für Client 4Einfache Implementierung eines Client für einen Web Service 4 Java2WSDL 4WSDL aus Java-Klasse generieren 4Vereinfacht das Erstellen eines Web Service 4PG P2P: Apache Axis 15 WSDL-Generierung für installierte Services 4 Ist ein Web Service mit Axis erstellt worden, erhält man die dazugehörige WSDL-Datei, indem man „?WSDL“ an die URL anhängt, z.B 4 http://localhost:8080/axis/services/EchoService?WSDL 4PG P2P: Apache Axis 16 WSDL2Java 4 WSDL2Java ermöglicht einfachen Zugriff auf einen Web Service Methodenaufruf Proxy-Stub Codegenerierung Clien t WSDL-Datei 4PG P2P: Apache Axis Web Servi ce 17 WSDL2Java 4 Generierte Klassen: WSDL Clausel Generierte Java-Klasse Für jeden Typ Eine Java-Klasse Einen Holder bei inout/outParametern Für jeden Port-Typ Ein Java-Interface Für jedes Binding Eine Stub-Klasse Für jeden Service Ein Service-Interface Eine ServiceImplementierung (Locator) 4PG P2P: Apache Axis 18 WSDL2Java 4 Erzeugung Client-Stub am Beispiel EchoService: EchoService.java EchoServiceService.java implements implements returns EchoServiceSoapBindingStub.java EchoServiceServiceLocator.java 4 EchoServiceService service = new EchoServiceServiceLocator(); 4 EchoService echo = service.getEchoService(); 4 String ret = echo.echo("Hallo"); 4PG P2P: Apache Axis 19 Java2WSDL 4 Tool, welches das Erstellen eines Web Service vereinfacht 4 Generierung einer WSDL-Datei aus Java-Klasse oder Interface 4 Aus dieser WSDL-Datei lassen sich weitere Dateien generieren: Java-Interface WSDL Stub für Client Vorlage für Implementation Deployment Descriptoren 4EchoServiceSoapBindingImpl.java deploy.wsdd EchoService.java undeploy.wsdd EchoServiceService.java EchoServiceServiceLocator.java Server-Skeleton EchoServiceSoapBindingstub.java 4EchoServiceSoapBindingSkeleton.java 4PG P2P: Apache Axis 20 Architektur 4 Axis arbeitet auf der Basis von Nachrichtenverarbeitung 4 Eine Nachricht wird in ein MessageContext-Objekt verpackt und durch eine Reihe von Handlern verarbeitet, die in einer bestimmten Reihenfolge aufgerufen werden MessageContext Request Message SOAPPart Attachment Response Message SOAPPart Attachment 4PG P2P: Apache Axis 21 Architektur 4 Handler: Java-Klasse, welche einen MessageContext verarbeitet 4 Jedem Handler wird MessageContext übergeben Message Context Handler Message Context 4 Kette (Chain): Zusammenfassung mehrerer Handler Message Context 4PG P2P: Apache Axis Handler 1 Handler 2 Handler 3 Message Context 22 Architektur 4 Unterscheidung, ob Axis als Server oder als Client verwendet wird 4 Als Server: 4 Eingehende SOAP-Nachricht wird von Transport Listener in MessageContext-Objekt verpackt 4 MessageContext wird an Axis-Engine weitergeleitet 4 Als Client: 4 MessageContext wird von Client-Applikation erzeugt 4 Es gibt drei übergeordnete Chains: 4 Transport, Global, Service 4 Jede dieser Chains kann Request- und Response-Chain enthalten 4PG P2P: Apache Axis 23 Architektur 4 Nachrichtenpfad Quelle: www.oio.de 4PG P2P: Apache Axis 24 Handler für Web Service definieren 4 Man kann einem Web Service Handler zuweisen 4 Beispiel: LogHandler 4 Ist bereits in Axis enthalten 4 Ein Handler wird in der wsdd-Datei definiert: <deployment …> <handler name="track" type="java:samples.userguide.example4.LogHandler"> <parameter name="filename" value="MyService.log"/> </handler> <service name=“EchoService" provider="java:RPC"> … <requestFlow> <handler type="track"/> </requestFlow> … </service> </deployment> 4PG P2P: Apache Axis 25 Axis mit eigenen Handlern erweitern 4 Wie bei einem Service kann man auch Axis mit eigenen Handlern erweitern 4 Definition erfolgt in Server-config.wsdd: <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <globalConfiguration> <requestFlow></requestFlow> <responseFlow></responseFlow> </globalConfiguration> <transport name="http"> <requestFlow></requestFlow> <responseFlow></responseFlow> </transport> </deployment> 4PG P2P: Apache Axis 26 Typ Mapping 4 Java-Datentypen müssen in XML kodiert werden 4 Einfache Datentypen werden automatisch serialisiert/deserialisiert 4 Axis folgt dabei der JAX-RPC-Spezifikation xsd:base64Binary byte[] xsd:hexBinary Byte[] xsd:boolean Boolean xsd:int Int xsd:byte Byte xsd:integer Java.math.BigInteger xsd:dateTime Java.util.Calendar xsd:long Long xsd:decimal Java.math.BigDeci mal xsd:Qname Javax.xml.namespace .Qname xds:double Double xsd:short Short xsd:float Float xsd:string Java.lang.String 4PG P2P: Apache Axis 27 Bean Serializer 4 Axis kann Java Beans automatisch serialisieren/deserialisieren class Bestellung { private int Anzahl; private String Kunde; … public void setAnzahl(int Anzahl) { this.Anzahl = Anzahl; } public int getAnzahl() { return Anzahl; } … } 4 Bean-Mapping muss in wsdd-Datei angegeben werden <beanMapping qname="ns:local" xmlns:ns="someNamespace" languageSpecificType="java:Bestellung"/> 4PG P2P: Apache Axis 28 Scoping 4 Angabe des Scope-Parameters ermöglicht Kontrolle über Erzeugung der Service-Objekte 4 Request Scope 4 Bei jeder Anfrage wird eine neue Instanz des Service erstellt (Standardeinstellung) 4 Application Scope 4 Es wird ein einzelnes Objekt erzeugt, das alle Anfragen bearbeitet 4 Shared Objekt 4 Session Scope 4 Für jeden verbundenen Client wird ein Objekt erzeugt 4PG P2P: Apache Axis 29 TCPMonitor 4 Zum Betrachten des Netzwerkverkehrs 4 Aufruf über Kommandozeile: java org.apache.axis.utils.tcpmon [listenport targetHost targetPort] 4 Nachricht wird an TCPMonitor geschickt, dann erst an den Empfänger 4PG P2P: Apache Axis 30 TCP Monitor Ausgehende Nachricht Eingehende Nachricht 4PG P2P: Apache Axis 31 Zusammenfassung Features: 4 Unterstützt SOAP 1.1 / 1.2 4 Unterstützt alle Basistypen sowie ein Typ-Mapping-System für eigene Serializer/Deserializer 4 Umwandlung von Java-Collections in SOAP-Arrays und umgekehrt 4 Automatische Serialisierung/Deserialisierung von EJB 4 Automatische WSDL-Generierung für Web Services 4 WSDL2Java: Generierung von Java-Klassen für Client 4 Java2WSDL: Generierung WSDL aus Java-Klasse 4 TCPMonitor: Kontrollieren von TCP/IP-Paketen 4PG P2P: Apache Axis 32 Zusammenfassung 4 Vorteile 4 Zur Zeit wohl eines der besten kostenlosen SOAP-Frameworks für Java 4 Hohe Konfigurierbarkeit, da durch Handler beliebig erweiterbar 4 Standard- Javatypen und JavaBeans werden automatisch behandelt 4 Schnelles Deployment einfacher Web Services 4 Einfache Client-Implementation mit WSDL2Java 4 Einfache Erstellung eines Web Service mit Java2WSDL 4PG P2P: Apache Axis 33 Zusammenfassung 4 Nachteile 4 Keine asynchrone Nachrichtenverarbeitung 4 keine vollständige Unterstützung von SOAP-Attachments 4 Weniger effizient als RMI oder Corba 4Allgemeiner Nachteil von Web Services 4 Keine eigene Unterstützung von UDDI 4Arbeitet aber gut mit UDDI4J zusammen 4PG P2P: Apache Axis 34 Axis in der Projektgruppe 4 Aufgaben: 4 Web Service zum Bereitstellen und Monitoring von Ressourcen auf einem Rechner 4Bereitstellen gewonnener Daten mit Axis kein Problem 4Aber: ist Java geeignet zum Ressourcen-Monitoring? 4 Beantwortung und Weiterleitung lokaler Suchanfragen 4Axis kann als Server und als Client agieren; Weiterleiten von Suchanfragen möglich 4PG P2P: Apache Axis 35 4Danke für die Aufmerksamkeit 4PG P2P: Apache Axis 36