18.8 Der Server
 
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 und muss weder etwas mit Remote noch mit Serializable zu schaffen haben.
18.8.1 Entfernte Objekte beim Namensdienst anmelden
 
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.3
com/javatutor/insel/rmi/Server.java
package com.javatutor.insel.rmi;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RemoteServer;
import java.rmi.server.UnicastRemoteObject;
public class Server
{
public static void main( String[] args ) throws Exception
{
AdderImpl adder = new AdderImpl();
Adder stub = (Adder) UnicastRemoteObject.exportObject( adder, 0 );
RemoteServer.setLog( System.out );
Registry registry = LocateRegistry.getRegistry();
registry.rebind( "Adder", stub );
System.out.println( "Adder angemeldet" );
}
}
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, sodass er auch weggelassen werden kann. Ist kein Rechnername angegeben, wird localhost angenommen. Daher steht im oberen Beispiel einfach nur rebind("Adder", stub).
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.
Und abmelden
Ist der Dienst nicht mehr erwünscht, kann er mit unbind() wieder abgemeldet werden, solange der Namensdienst läuft. Aus Sicherheitsgründen lässt der Namensdienst Objekte nur von jenem Server entbinden, der das Objekt auch angemeldet hat. Einen zusätzlichen Namen müssen wir daher nicht angeben.
final class java.rmi.registry. LocateRegistry
|
|
static void static Registry getRegistry()
Liefert einen Verweis auf die Registry oder löst eine RemoteException, wenn die Registry nicht lokalisiert werden konnte. |
interface java.rmi.registry. Registry
extends Remote
|
|
void bind( String name, Remote obj )
throws AlreadyBoundException, MalformedURLException, RemoteException
Bindet das Objekt ref, das 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. |
|
void rebind( String name, Remote obj )
Verhält sich wie bind(), mit dem Unterschied, dass Objekte ersetzt werden, sofern sie schon angemeldet sind. |
|
void unbind( String name )
Entfernt das Objekt aus der Registrierung. Ist das Objekt nicht gebunden, folgt eine NotBoundException. Die anderen Fehler sind wie bei bind(). |
18.8.2 Automatisches Anmelden bei Bedarf
 
Bisher haben wir ein entferntes Objekt erzeugt und angemeldet, sodass das Objekt später schon da ist, wenn es angesprochen wird. 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 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, sodass es Anfragen entgegennehmen kann. Wird das Objekt nach seiner Tat wiederum nicht verwendet, kann es wieder eingefroren werden. Die Daten bleiben dabei stabil. Activatable11
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.
|