10.1 Remote Method Invocation (RMI) Verteilte Java Anwendungen Methodenaufrufe auf Fremdobjekten (remote objects) Object Serialization Typen bleiben erhalten Package java.rmi (und andere) Vorläufige Version 411 c 2003 Peter Thiemann
Überblick Definition des remote interface Implementierung der Serverklassen Vorläufige Version 412 c 2003 Peter Thiemann
10.1.1 Remote Interface package examples.myremoteinterface; public interface MyRemoteInterface extends java.rmi.remote { String sayhello() throws java.rmi.remoteexception; } Protokoll = Methoden des Interface Falls andere Remote Objects als Parameter oder Ergebnis von Methoden auftreten, so darf nicht ihr Klassentyp, sonder ihr (remote) Interfacetyp deklariert werden! Vorläufige Version 413 c 2003 Peter Thiemann
10.1.2 Implementierung des Remote Interface package examples.myremoteinterface; import java.rmi.*; import java.rmi.server.unicastremoteobject; public class Hello extends UnicastRemoteObject implements MyRemoteInterface { erweitert den Server UnicastRemoteObject einfaches Remote Object mit TCP-Kommunikation ständig laufender Server deklariert gewünschtes Remote Interface Vorläufige Version 414 c 2003 Peter Thiemann
Konstruktor des Remote Object private String name; public Hello(String s) throws RemoteException { super(); name = s; } muss Konstruktor von UnicastRemoteObject aufrufen: exportiert das Objekt erzeugt einen Server, der an einem anonymen Port auf Methodenaufrufe für Hello wartet java.rmi.remoteexception: ausgelöst, falls Export des Objekts nicht möglich oder keine Netzwerkressourcen vorhanden Vorläufige Version 415 c 2003 Peter Thiemann
Implementierung des Remote Interface public String sayhello() throws RemoteException { return (name + " says: Hello World!"); } Methode aus MyRemoteInterface Argumente und Rückgabewerte: beliebige primitive Typen; Klassen müssen IF java.io.serializable implementieren Marshalling lokale Objekte werden kopiert (nur Felder, die weder statisch noch transient sind) fremde Objekte (remote objects) werden als Referenzen übergeben Vorläufige Version 416 c 2003 Peter Thiemann
Startmethode des Servers public static void main(string args[]) { if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } Security Manager wacht darüber, daß keine illegalen Operationen ausgeführt werden auch selbstdefinierter Security Manager möglich ohne Security Manager: keine RMI Klassen möglich Vorläufige Version 417 c 2003 Peter Thiemann
... Erzeugen des Remote Objects try { Hello obj = new Hello("HelloServer"); mehrere Objekte möglich Objekt hört, sobald es konstruiert ist Vorläufige Version 418 c 2003 Peter Thiemann
Publikation des Remote Objects Naming.rebind("//host /HelloServer", obj); System.out.println("HelloServer bound in registry"); host : Hostname oder IP-Adresse des Serverrechners Verzeichnisdienst für remote objects: //host [:port ]/string URL ohne Schema Standardport des Verzeichnisdienstes: 1099 Remote Objects verlassen niemals ihren eigenen Adreßraum Registration nur direkt auf Serverrechner (Sicherheit!) Anfrage an Verzeichnisdienst Referenz auf das Remote Object Vorläufige Version 419 c 2003 Peter Thiemann
10.1.3 Verwendung des Remote Objects package examples.myremoteinterface; import java.awt.*; import java.rmi.*; public class HelloApplet extends java.applet.applet { String message = ""; public void init() { try { Hello obj = (Hello)Naming.lookup("//" + getcodebase().gethost() + "/HelloServer"); message = obj.sayhello(); } catch (Exception e) { System.out.println("HelloApplet exception: " + e.getmessage()); e.printstacktrace(); } } } public void paint(graphics g) { g.drawstring(message, 25, 50); } Vorläufige Version 420 c 2003 Peter Thiemann
Verwendung 1. Naming.lookup ("//host /service ") kontaktiert den Verzeichnisdienst auf host und fragt dort nach service falls er existiert, so liefert lookup ein Stub-Objekt, das mit dem service Objekt verbunden ist die entsprechende Klasse wird ggf. noch geladen 2. obj.sayhello () aktiviert das Stub-Objekt serialisiert die Parameter und verschickt sie empfängt die Antwort (warten) deserialisiert sie in ein Objekt entsprechend des Ergebnistyps String 3. Anzeige durch paint () Vorläufige Version 421 c 2003 Peter Thiemann
10.1.4 Erzeugung der Stubs rmic erzeugt (client) stubs und (server) skeletons aus Package (Bsp: examples.myremoteinterface) client stub Klasse implementiert Remote Interface führt Serialisierung durch und implementiert RMI Protokoll server skeleton führt Deserialisierung durch ruft Methode auf Ausgabe: class files Vorläufige Version 422 c 2003 Peter Thiemann
10.1.5 Einbettung in Applet <applet codebase="myclasses/" code="examples.myremoteinterface.helloapplet" width=500 height=120> </applet> webserver muss = RMI Objektserver code Attribut muss voll qualifiziert sein (Pfadname): HTML Seite in $(WWWDIR) Class files in $(WWWDIR)/myclasses/examples/myremoteinterface Vorläufige Version 423 c 2003 Peter Thiemann
10.1.6 Start des Verzeichnisdiensts rmiregistry caches interfaces restart on change Vorläufige Version 424 c 2003 Peter Thiemann
10.1.7 Start des Servers benötigt java.rmi.server.codebase Property, da client stubs vom Server verschickt werden. benötigt java.security.policy Property zur Initialisierung des SecurityManager java -Djava.rmi.server.codebase=\ http://myhost/~myusrname/codebase/ \ -Djava.security.policy=PATHTOPOLICYFILE \ examples.myremoteinterface.helloimpl Vorläufige Version 425 c 2003 Peter Thiemann
10.2 SOAP Simple Object Access Protocol XML-basiertes Protokoll für Remote Procedure Call Transport durch HTTP ( zustandslos) Serialization definiert durch XML Schema (Standardformat, Erweiterbarkeit) POST /StockQuote HTTP/1.1 Host: www.stockquoteserver.com Content-Type: text/xml; charset="utf-8" Content-Length: nnnn SOAPAction: "Some-URI" <SOAP-ENV:Envelope...> <SOAP-ENV:Body> <m:getlasttradeprice xmlns:m="some-uri"> <symbol>dis</symbol> </m:getlasttradeprice> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Vorläufige Version 426 c 2003 Peter Thiemann
SOAP: Reisebüro Reiseveranstalter <?xml version= 1.0?> <env:envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:header> <m:reservation xmlns:m="http://travelcompany.example.org/reservation" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustunderstand="true"> <m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference> <m:dateandtime>2001-11-29t13:20:00.000-05:00</m:dateandtime> </m:reservation> <n:passenger xmlns:n="http://mycompany.example.com/employees" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustunderstand="true"> <n:name>marilyn Manson</n:name> </n:passenger> </env:header> <env:body> <p:itinerary xmlns:p="http://travelcompany.example.org/reservation/travel"> <p:departure> <p:departing>new York</p:departing> <p:arriving>los Angeles</p:arriving> <p:departuredate>2001-12-14</p:departuredate> <p:departuretime>late afternoon</p:departuretime> <p:seatpreference>aisle</p:seatpreference> </p:departure> Vorläufige Version 427 c 2003 Peter Thiemann
<p:return> <p:departing>los Angeles</p:departing> <p:arriving>new York</p:arriving> <p:departuredate>2001-12-20</p:departuredate> <p:departuretime>mid-morning</p:departuretime> <p:seatpreference/> </p:return> </p:itinerary> <q:lodging xmlns:q="http://travelcompany.example.org/reservation/hotels"> <q:preference>none</q:preference> </q:lodging> </env:body> </env:envelope> Vorläufige Version 428 c 2003 Peter Thiemann
Erklärung nur Elemente/Attribute mit NS Präfix env sind in SOAP definiert Rest anwendungsspezifisch env:header ist optional (Erweiterung) env:role zusammen mit env:mustunderstand: nächster Empfänger muss diesen Header verarbeiten oder die Nachricht zurückweisen (SOAP Nachrichten können über Proxies vermittelt werden) env:body ist verpflichtend Informationsaustausch zwischen Sender und Empfänger Übertragung durch HTTP (GET oder POST), Email, RPC, etc Vorläufige Version 429 c 2003 Peter Thiemann
SOAP: Reiseveranstalter Reisebüro <?xml version= 1.0?> <env:envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:header> <m:reservation xmlns:m="http://travelcompany.example.org/reservation" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustunderstand="true"> <m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference> <m:dateandtime>2001-11-29t13:35:00.000-05:00</m:dateandtime> </m:reservation> <n:passenger xmlns:n="http://mycompany.example.com/employees" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustunderstand="true"> <n:name>marilyn Manson</n:name> </n:passenger> </env:header> <env:body> <p:itineraryclarification xmlns:p="http://travelcompany.example.org/reservation/travel"> <p:departure> <p:departing> <p:airportchoices> JFK LGA EWR </p:airportchoices> </p:departing> </p:departure> Vorläufige Version 430 c 2003 Peter Thiemann
<p:return> <p:arriving> <p:airportchoices> JFK LGA EWR </p:airportchoices> </p:arriving> </p:return> </p:itineraryclarification> </env:body> </env:envelope> Vorläufige Version 431 c 2003 Peter Thiemann
Spezielle Konvertionen für SOAP RPC Nötige Information 1. Adresse des Zielknotens 2. Prozedur- / Methodenname. 3. Verweise oder Werte von Parametern und Rückgabewerten 4. Trennung zwischen Identifikation der Zielressource im Web von Daten bzw. Kontrollinformation 5. Protokoll zwischen den Knoten, Transportmittel 6. Header Information Vorläufige Version 432 c 2003 Peter Thiemann
10.3 WSDL Web Service Description Language XML basiert beschreibt Ort und Protokoll des Service Hauptelemente (XML): porttype Operationen des Service (vgl. RPC Programm) message Spezifikation der Nachrichtenparameter types Datentypen (XML Schema) binding Nachrichtenformat und Protokoll Vorläufige Version 433 c 2003 Peter Thiemann
WSDL Beispiel <message name="gettermrequest"> <part name="term" type="xs:string"/> </message> <message name="gettermresponse"> <part name="value" type="xs:string"/> </message> <porttype name="glossaryterms"> <operation name="getterm"> <input message="gettermrequest"/> <output message="gettermresponse"/> </operation> </porttype> xs ist XSchema namespace Vorläufige Version 434 c 2003 Peter Thiemann
WSDL Beispiel: Einweg-Operation <message name="newtermvalues"> <part name="term" type="xs:string"/> <part name="value" type="xs:string"/> </message> <porttype name="glossaryterms"> <operation name="setterm"> <input name="newterm" message="newtermvalues"/> </operation> </porttype> kein Rückgabewert keine Antwort Vorläufige Version 435 c 2003 Peter Thiemann
Weitere Operationsarten Ausgabeanforderung (kein <input>), Bsp: <message name="whattimevalue"/> <message name="thetimevalue"> <part name="time" type="xs:date"/> </message> <porttype name="date"> <operation name="currenttime"> <input name="whattime" message="whattimevalue"/> <output name="thetime" message="thetimevalue"/> </operation> </porttype> Notification : Ausgabe ohne Anforderung Vorläufige Version 436 c 2003 Peter Thiemann
SOAP Bindung <porttype name="glossaryterms"> <operation name="getterm">... <binding type="glossaryterms" name="b0"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <operation> <soap:operation soapaction="http://example.com/getterm"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> soap ist der SOAP name space style rpc, document transport definert Basisprotokoll (HTTP) Vorläufige Version 437 c 2003 Peter Thiemann
10.4 UDDI UDDI = Universal Description, Discovery and Integration Verzeichnisdienst zur Registration und Suche von Web Services Kommunikation via SOAP Teil von.net geschäftsorientiert verwendet WSDL für Service Beschreibung zunächst offline: Dienst für den Programmierer dynamisch verifiziert Vorläufige Version 438 c 2003 Peter Thiemann