Universität Ulm Fakultät für Informatik Abteilung Verteilte Systeme Projektgruppe AspectIX AVO Übung 1 Java RMI, Custom Sockets, Activation 2. November 2004 (WS 2004) Andreas I. Schmied (schmied@inf...)
1 Beispielprojekte Autor: Felix.Traier@inf... avo1 HelloWorld avo2a Bank Beispiel avo2b... mit XOR Encoding (avo2c... mit Activatable Objects) Verwendung use eclipse3-gtk Import/Existing Project... Copyright 2004, Andreas I. Schmied, Abteilung Verteilte Systeme, Universität Ulm 2/10
1 Beispielprojekte Aufbau der Projekte Gezipptes Eclipse-Projekt Startklassen RMIClient, RMIServer bzw. RMISetup integrierter Nameserver anstatt rmiregistry integrierter Webserver für RMIClassLoader adaptiert von http://java.sun.com/products/jdk/rmi/class-server.zip Shell, beliebige IDE, am besten Eclipse nutzen readme.txt lesen! Eclipse: Compare With/Each Other zwischen Beispielen avo2a/src/infvs.avo2a <-> avo2b/src/infvs.avo2b ANT-Files Launches für ANT-Tasks startbare JARs, z.b. java -jar avo2b-rmiclient.jar Copyright 2004, Andreas I. Schmied, Abteilung Verteilte Systeme, Universität Ulm 3/10
2 Aufgaben Grundlage: avo2a 1. Value Objects Account soll nicht mehr Remote, sondern nur noch im Server zugreifbar sein Kontodaten als serialisiertes AccountData Object verschicken Kontonummer, Client-Referenz, Kontostand bzw. Transaktionswert Zugriff über Client Objekt, z.b.: AccountData[] accs = Client.getAccounts(); Client.deposit(AccountData d); Client.withdraw(AccountData d); Implikationen bei Änderung der Daten im RMIClient? Copyright 2004, Andreas I. Schmied, Abteilung Verteilte Systeme, Universität Ulm 4/10
2 Aufgaben 2. Activation Client-Objekte sollen passivierbar werden Account-Daten abspeichern Setup-Klasse anstatt RMIServer 1. erzeugt Activation Group 2. registriert Objekte 3. beendet sich Client bekommt aktivierbare Referenzen von Registry automatisch gestartete VM(s) beobachten (Logging ->Literaturliste) Achtung: Immer Multi-Host Szenarien testen! Copyright 2004, Andreas I. Schmied, Abteilung Verteilte Systeme, Universität Ulm 5/10
3 Dynamisches Klassenladen Codebase Property für Serverprozess java -Djava.rmi.server.codebase=http://myhost:myport... wird in serialisiertem Stub annotiert void java.io.objectoutputstream.annotateclass(java.lang.class cl); "localhost" bringt im VS wenig... java.net.inetaddress.getlocalhost().gethostname() Classpaths benötigen trailing slash am Ende einer Pfadangabe Properties auch während Programmstart setzbar void java.lang.system.setproperties(java.util.properties props); Copyright 2004, Andreas I. Schmied, Abteilung Verteilte Systeme, Universität Ulm 6/10
3 Dynamisches Klassenladen Registry darf keinen direkten Zugriff auf Klassen registrierter Objekte haben Beispiel: 1. Server meldet Objekt an 2. Registry erhält serialisierten Stub inkl. Codebase 3. löst Codebase nicht auf, da Klassen über Classpath lesbar 4. deserialisiert Stub 5. Anfrage von Client 6. antwortet mit serialisiertem Stub ohne Codebase 7. Client kann Klassen nicht nachladen! Classpath löschen! (bzw. Codebase korrekt setzen) Copyright 2004, Andreas I. Schmied, Abteilung Verteilte Systeme, Universität Ulm 7/10
4 Sicherheit Security Manager notwendig, damit Klassen nachgeladen werden können System.setSecurityManager(new java.rmi.rmisecuritymanager()); Security Policies steuern Verhalten des Security Managers java -Djava.security.policy=my-policy-file... Policy File mit Grants permission class ["target"] [, "actions"]; grant { // permission java.security.allpermission; // böse! permission java.net.socketpermission "localhost:1099", "connect, resolve, accept"; }; Unterscheiden nach Client, Server, (In-Server-) Registry Copyright 2004, Andreas I. Schmied, Abteilung Verteilte Systeme, Universität Ulm 8/10
5 Typen Typinformation im RMI-System Beispiel: Remote r = java.rmi.naming.lookup("my-object-id"); Object o = (Object) r; Bank b; if (o instanceof Bank) b = (Bank) o; // Trivial Upcast // Type Reflection // Downcast Upcast (trivial) möglich Downcast mit Sprachmitteln möglich komplette Typinformation in Stub enthalten Klassen bei Deserialisierung bereits geladen nur bedingt in anderer Middleware möglich! Copyright 2004, Andreas I. Schmied, Abteilung Verteilte Systeme, Universität Ulm 9/10
6 Literatur RMI Tutorial http://java.sun.com/docs/books/tutorial/rmi/index.html RMI Guide http://java.sun.com/j2se/1.4.2/docs/guide/rmi/ RMI over SSL http://java.sun.com/j2se/1.4.2/docs/guide/rmi/socketfactory/sslinfo.html Activation Tutorial http://java.sun.com/j2se/1.4.2/docs/guide/rmi/activation/overview.html ANT http://ant.apache.org Java Logging Facility http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/ JUnit Tests http://www.junit.org Zum Vergleich ist die Versionsnummer "1.4.2" überall auch durch "1.5.0" zu ersetzen. Copyright 2004, Andreas I. Schmied, Abteilung Verteilte Systeme, Universität Ulm 10/10