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

Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5 (Tiger-Release)
Buch: Java ist auch eine Insel
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
    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.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.8 Der Servedowntop

An dieser Stelle haben wir schon fast alles zusammen. Der Namensdienst läuft und wartet auf den Server und den Client. Beginnen wir mit dem Server. Er ist ein normales Java-Programm ohne Einschränkungen. Er muss weder etwas mit Remote noch mit Serializable zu schaffen haben.


Galileo Computing

18.8.1 Entfernte Objekte beim Namensdienst anmelden  downtop

Die einzige Aufgabe des Servers ist es, ein entferntes Objekt anzulegen und beim Namensdienst einzutragen. Dazu wird die Methode rebind() oder bind() benutzt.

Listing 18.4   AdderServer.java


import java.rmi.*;
import java.rmi.server.*;

public class AdderServer
{
  public static void main( String args[] ) throws Exception
  {
      Naming.rebind  ( "rmi://localhost/adder", new AdderImpl() );

    System.out.println( "Adder bound" );
  }
}

An diesem Programm ist abzulesen, dass das Eintragen sehr einfach ist. Es ist als assoziative Datenstruktur zu verstehen, die einen Objektnamen mit einem entfernten Objekt assoziiert. Die Notation beim Anmelden für das Objekt ist wie bei einer URL:


rmi://Host:Port/Objektname

Wenn ein alternativer Port für den Namensdienst gewählt wurde, stellen wir diesen mit Doppelpunkt wie üblich hinten an – sonst läuft der Namensdienst standardmäßig unter 1099. Der vorangestellte Protokollname rmi ist optional, so dass er auch weggelassen werden kann. Ist kein Rechnername angegeben, so wird localhost angenommen. Im oberen Beispiel lässt sich damit auch einfach schreiben: rebind("adder", new AdderImpl()).

Was hat das Binden damit zu tun?

Zum Binden der Informationen bietet der Namensdienst zwei unterschiedliche Funktionen an. bind() trägt den Dienst im Namensdienst ein, aber wenn schon ein anderer Dienst unter dem gleichen Namen läuft, wird eine AlreadyBoundException ausgelöst. rebind() dagegen fügt, abhängig vom Namensdienst, einen neuen Eintrag mit dem gleichen Namen hinzu oder überschreibt den alten.

Meldet der Server das Remote-Objekt an (AdderImpl), so wird es serialisiert und zur Registry übertragen. Der Client wird später dieses serialisierte Objekt bekommen und wichtige Informationen entnehmen können.

Und abmelden

Ist der Dienst nicht mehr gewünscht, so lässt er sich mit unbind() wieder abmelden, solange der Namensdienst läuft. Aus Sicherheitsgründen lässt der Namensdienst Objekte nur von dem Server entbinden, der auch das Objekt angemeldet hat. Einen zusätzlichen Namen müssen wir daher nicht angeben.



final class java.rmi.  Naming  

gp  static void bind( String name, Remote obj )
throws AlreadyBoundException, MalformedURLException, RemoteException
Bindet das Objekt ref, welches in der Regel der Stub ist, an den Namen name und trägt es so in der Registrierung ein. Eine AlreadyBoundException zeigt an, dass der Name schon vergeben ist. Die MalformedURLException informiert, wenn der Name ungültig gebunden ist. Eine RemoteException wird ausgelöst, wenn der Namensdienst nicht erreicht werden konnte. Fehlende Rechte führen zu einer AccessException.
gp  static void rebind( String name, Remote obj )
Verhält sich wie bind(), mit dem Unterschied, dass Objekte ersetzt werden, falls sie schon angemeldet sind.
gp  static void unbind( String name )
Entfernt das Objekt aus der Registrierung. Ist das Objekt nicht gebunden, so folgt eine NotBoundException. Die anderen Fehler sind wie bei bind().

Galileo Computing

18.8.2 Automatisches Anmelden bei Bedarf  toptop

Bisher haben wir ein entferntes Objekt erzeugt und angemeldet, so dass später das Objekt schon da ist, wenn es angesprochen wird. Wir haben das durch UnicastRemoteObject realisiert, dessen Arbeitsweise darin besteht, das Objekt einmal anzumelden. Sollten auf einem Objekt-Server mehrere Dienste vor sich hin dämmern, ist das natürlich nicht sonderlich effektiv und kostet unnötig Ressourcen. Daher unterstützt die Bibliothek neben UnicastRemoteObject eine weitere Klasse, die das automatische Hochstarten eines Dienstes erlaubt. Wir leiten unser Objekt dann von der Klasse Activatable ab, und daraufhin werden die Objekte bis zu ihrer Aktivierung in einem Dämmerzustand gehalten. Kommt dann der erste Zustand, entfaltet das System dieses Objekt, so dass es Anfragen entgegennehmen kann. Wird das Objekt nach seiner Tat wiederum nicht verwendet, kann es wieder eingefroren werden. Die Daten bleiben dabei stabil. Activatable

ist eine abstrakte Klasse, die von RemoteServer abgeleitet ist. Die unterschiedlichen Klassen zum Aktivieren bei Bedarf liegen alle im Paket java.rmi. activation.






1   Wieder etwas, was auf -able endet, aber keine Schnittstelle ist.





Copyright © 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