18.4 Definition einer entfernten Schnittstelle
Damit der Client eine entfernte Methode nutzen kann, muss er ein Stellvertreterobjekt befragen. Dieses packt die Daten ein und übermittelt sie. Wir haben gesagt, dass diese Hilfsfunktionen automatisch generiert werden. Damit der Generator korrekten Quellcode für die Übertragung erstellen kann, ist eine Beschreibung nötig. Die Definition muss die Signatur eindeutig spezifizieren, und damit weiß der Client, wie die Funktion aussieht, die er aufrufen kann, und der Server kann die Methode dann beschreiben. Normalerweise gibt es für die Spezifikation der entfernten Funktionen spezielle Beschreibungssprachen (wie IDL bei CORBA), doch bei RMI reicht es, ein Java-Interface mit den Methoden zu definieren.
Listing 18.1 Adder.java
import java.rmi.*;
public interface Adder extends Remote
{
public int add( int x, int y ) throws RemoteException;
}
An diesem Beispiel können wir mehrere wichtige Eigenschaften der Schnittstelle ablesen:
|
Die entfernte Schnittstelle ist öffentlich. Wenn sie nur paketsichtbar oder eingeschränkter ist, kann der Client die entfernte Methode nicht finden, wenn er danach verlangt. |
|
Die eigene Schnittstelle erweitert die Schnittstelle Remote. Nur die Klassen, die Remote implementieren, können entfernte Methoden anbieten. Remote ist allerdings leer und damit eine Markierungsschnittstelle. |
|
Die angebotenen Methoden können nicht beabsichtigte Fehler auslösen, zum Beispiel, wenn das Transportsystem zusammenbricht. Für diesen Fall muss jede Methode RemoteException in einer throws-Anweisung aufführen. |
|
Eine entfernte Funktion darf Parameter besitzen. Sind dies primitive Werte, so werden diese einfach übertragen. Handelt es sich um Objekte, so müssen diese serialisierbar sein. |
Hinweis Wir werden im Folgenden alle Klassen in ein Verzeichnis legen. Zum Schluss werden wir - inklusive der automatisch erzeugten Stellvertreter-Objekte - folgende Dateien vorfinden:
Adder.class
AdderImpl.class
AdderImpl_Skel.class
AdderImpl_Stub.class
AdderClient.class
AdderServer.class
Es ist wichtig zu verstehen, dass Client sowie Server Zugriff auf die Klassendateien brauchen. Zwar braucht der Client nicht AdderImpl_Skel.class, aber das soll egal sein.
|
|