Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5
Java ist auch eine Insel

Java ist auch eine Insel
5., akt. und erw. Auflage
1454 S., mit CD, 49,90 Euro
Galileo Computing
ISBN 3-89842-747-1
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 Implementierung der Remote-Schnittstelle
  gp 18.6 Stellvertreterobjekte erzeugen
  gp 18.7 Der Namensdienst (Registry)
    gp 18.7.1 Der Port
  gp 18.8 Der Server
    gp 18.8.1 Entfernte Objekte beim Namensdienst anmelden
    gp 18.8.2 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.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 Daily Soap
    gp 18.15.1 SOAP-Implementierungen
    gp 18.15.2 Einen Client mit der Apache-Bibliothek implementieren
    gp 18.15.3 Der Seifen-Server
  gp 18.16 Java Message Service (JMS)


Galileo Computing

18.9 Einen Client programmieredowntop

Ebenso wie der Server ist der Client ein normales Java-Programm, das 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.4   com/javatutor/insel/rmi/Client.java

package com.javatutor.insel.rmi;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client
{
  public static void main( String[] args ) throws Exception
  {
    Registry registry = LocateRegistry.getRegistry();
    Adder adder = (Adder) registry.lookup( "Adder" );
    System.out.println( adder.add( 4711 ) );
  }
}

Damit ist das letzte Puzzlestück zusammen und das RMI-Beispiel vollständig. LocateRegistry.getRegistry() kennen wir schon – das liefert uns die Registry. lookup() gibt zu einer URL das Stub-Objekt (daher ist der Rückgabetyp Remote) das in unserem Fall die Schnittstelle Adder implementiert. Ein lokaler Funktionsaufruf unterscheidet sich nicht mehr von einem entfernten! 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.


inferface java.rmi.registry.  Registry
  extends Remote

gp  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  String[] list( String name ) Liefert ein Feld mit angemeldeten Diensten. Der angegebene Name gibt die URL des Namensdienstes an. Ist die URL falsch konstruiert, folgt eine MalformedURLException; ist die Registry nicht erreichbar, folgt eine RemoteException.

Galileo Computing

18.9.1 Einfaches Logging  toptop

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. Außerdem setzt die statische Funktion RemoteServer.setLog(OutputStream) sowie den Fehlerausgabestrom. Mittels getLog(), das 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();

 << zurück




Copyright © Galileo Press GmbH 2005
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, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de