Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
gp Kapitel 18 Verteilte Programmierung mit RMI und SOAP
gp 18.1 Entfernte Methoden
gp 18.1.1 Wie entfernte Methoden arbeiten
gp 18.1.2 Stellvertreter (Proxy)
gp 18.1.3 RMI
gp 18.1.4 Wie die Stellvertreter die Daten übertragen
gp 18.1.5 Probleme mit entfernten Methoden
gp 18.2 Nutzen von RMI bei Middleware-Lösungen
gp 18.3 Die Lösung für Java ist RMI
gp 18.3.1 Entfernte Objekte programmieren
gp 18.3.2 Entfernte und lokale Objekte im Vergleich
gp 18.4 Definition einer entfernten Schnittstelle
gp 18.5 Das entfernte Objekt
gp 18.5.1 Der Bauplan für entfernte Objekte
gp 18.5.2 Der Konstruktor
gp 18.5.3 Implementierung der entfernten Methoden
gp 18.6 Stellvertreterobjekte erzeugen
gp 18.6.1 Das Dienstprogramm rmic
gp 18.7 Der Namensdienst (Registry)
gp 18.7.1 Der Port
gp 18.8 Der Server: entfernte Objekte beim Namensdienst anmelden
gp 18.8.1 Automatisches Anmelden bei Bedarf
gp 18.9 Einen Client programmieren
gp 18.9.1 Einfaches Logging
gp 18.10 Aufräumen mit dem DGC
gp 18.11 Entfernte Objekte übergeben und laden
gp 18.11.1 Klassen vom RMI-Klassenlader nachladen
gp 18.11.2 Sicherheitsmanager
gp 18.12 Registry wird vom Server gestartet
gp 18.13 RMI über die Firewall
gp 18.13.1 RMI über HTTP getunnelt
gp 18.14 RMI und CORBA
gp 18.15 UnicastRemoteObject, RemoteServer und RemoteObject
gp 18.16 Daily Soap
gp 18.16.1 SOAP-Implementierung der Apache-Gruppe
gp 18.16.2 Einen Client mit der Apache-Bibliothek implementieren
gp 18.16.3 Der Seifen-Server
gp 18.17 Java-API für XML Messaging (JAXM)
gp 18.18 Java Message Service (JMS)
gp 18.18.1 OpenJMS
gp 18.18.2 Beispiel mit Konsument und Produzent im Publish-Subscribe-Modell


Galileo Computing

18.9 Einen Client programmierendowntop

Ebenso wie der Server ist der Client ein normales Java-Programm, welches weder etwas mit Remote noch mit Serializable zu tun hat. Um nun die entfernte Methode zu nutzen, muss ein entferntes Objekt gesucht und angesprochen werden. Dazu fragen wir den Namensdienst. Der Name für das Objekt setzt sich zusammen aus der URL und dem Namen des Dienstes. Bei Port-Angaben dürfen wir nicht vergessen, diesen wieder hinter einem Doppelpunkt anzugeben.

Listing 18.5 AdderClient.java

import java.rmi.*;
public class AdderClient
{
  public static void main( String args[] ) throws Exception
  {
    Adder a = (Adder) Naming.lookup( "rmi://localhost/adder" );
     int sum = a.add( 2, 2 );
     System.out.println( sum );
  }
}

Damit ist das letzte Puzzlestück zusammen und das RMI-Beispiel vollständig. Naming.lookup() liefert zu einer URL ein Stub-Objekt, welches die gewünschte Schnittstelle Adder implementiert. Der Rückgabetyp ist Remote. Das ist jetzt wirklich einfach, und wir sehen, dass sich ein lokaler Funktionsaufruf nicht mehr von einem entfernten unterscheidet. Bedenken wir an dieser Stelle, dass die Rückgabe von lookup() das Stellvertreter-Objekt ist. Eine Typumwandlung in den Server oder in AdderImpl würde natürlich nicht funktionieren, denn dieser existierte ja nur auf der Server- und nicht auf der Client-Seite.


final class java.rmi.Naming

gp static Remote lookup( String name )
throws NotBoundException, MalformedURLException, RemoteException
Liefert eine Referenz auf den Stub, der mit dem entfernten Objekt name verbunden ist. Ist kein Dienst unter dem Namen verfügbar, kommt es zu einer NotBoundException. Ist der Namensdienst nicht erreichbar, folgt eine RemoteException. MalformedURLException kann durch eine falsch gebildete URL folgen.
gp static String[] list( String name )
Liefert ein Feld mit angemeldeten Diensten. Der angegebene Name gibt die URL des Namensdienstes an. Ist die URL falsch konstruiert, so folgt eine MalformedURLException; ist die Registry nicht erreichbar, folgt eine RemoteException.

Galileo Computing

18.9.1 Einfaches Loggingtoptop

Um die Aktivität von RMI verfolgen zu können, haben die Entwickler einen einfachen Login-Mechanismus eingebaut. Er gibt Auskunft über die Objekte und entfernte Referenzen. Hier erfahren wir auch, ob alle gewünschten Objekte korrekt gefunden wurden. Das Logging lässt sich mit der Eigenschaft java.rmi.server.logClass einschalten, wenn der Wert auf true gesetzt ist. Dann erscheinen Ausgaben auf dem System.err-Fehlerkanal. Erweitern wir die Klasse RemoteServer, so erben wir zudem eine statische Funktion setLog(OutputStream), mit der sich der Fehlerausgabestrom individuell setzen lässt. Mittels getLog(), die einen PrintStream liefert und keinen OutputStream, gelangen wir wieder an den Fehlerkanal.


abstract class java.rmi.server.RemoteServer
extends RemoteObject

gp static void setLog( OutputStream out )
Loggt RMI-Aufrufe, indem sie in den Ausgabestrom out geschrieben werden. Ist out=null, wird das Logging beendet.
gp static PrintStream getLog()
Liefert den Ausgabestrom für das RMI-Logging.

Tipp Das Paket java.rmi.server hält noch eine andere Klasse bereit, die recht nützlich sein kann: UID. Mit dieser Klasse lässt sich eine einfache ID berechnen.
String s = new java.rmi.server.UID().toString();





Copyright (c) Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de