RMI-Implementierung

Die RMI-Implementierung (RMI = Remote Method Invocation) besteht aus drei Abstraktionsebenen.

Dabei handelt es sich um folgende Abstraktionsebenen:
  1. Die Ebene Stub und Entwurf, durch die vom Client an die Schnittstellenverweisvariable gestellte Methodenaufrufe abgefangen und an einen fernen RMI-Service umgeleitet werden.
  2. Die Ebene Ferner Verweis verfügt über Informationen zum Interpretieren und Verwalten von Verweisen, die von Clients für ferne Serviceobjekte gemacht werden.
  3. Die unterste Ebene ist die Ebene Transport, die auf TCP/IP-Verbindungen zwischen Systemen in einem Netz basiert. Sie stellt eine grundlegende Konnektivität zur Verfügung sowie einige Strategien zur Firewallpenetration.
Dieses Diagramm zeigt die Beziehung zwischen dem Clientprogramm und dem Serverprogramm über das RMI-System. Das RMI-System besteht aus den Stubs und Gerüsten sowie der fernen Referenzschicht auf der Client-und der Serverseite, die über die Transportschicht verbunden sind.

Zusätzlich zur TCP/IP-Schicht verwendet RMI ein Verbindungsprotokoll namens Java™ Remote Method Protocol (JRMP), das wie folgt funktioniert:

  1. Durch Objekte, die ein Verhalten über Fernzugriff erfordern, sollte die Klasse RemoteObject erweitert werden, und zwar üblicherweise um die Unterklasse UnicastRemoteObject.
    1. Durch die Unterklasse UnicastRemoteObject wird das ferne Objekt exportiert, um es für die Verarbeitung eingehender RMI-Aufrufe zur Verfügung zu stellen.
    2. Durch Exportieren des fernen Objekts wird ein neues Server-Socket erstellt, das an eine Portnummer gebunden wird.
    3. Es wird auch ein Thread erstellt, der für Verbindungen an diesem Socket empfangsbereit ist. Der Server wird bei einer Registry registriert.
    4. Ein Client erhält Details zur Verbindung zum Server aus der Registry.
    5. Anhand der Informationen aus der Registry, die den Hostnamen und Portdetails zum empfangsbereiten Socket des Servers beinhalten, wird vom Client die Verbindung zum Server hergestellt.
  2. Wenn vom Client der Aufruf einer fernen Methode an den Server abgesetzt wird, wird das Objekt TCPConnection erstellt, durch das am angegebenen Port ein Socket zum Server geöffnet wird. Über diese Verbindung werden die RMI-Kopfzeileninformationen und die zusammengesetzten Argumente unter Verwendung der Klasse StreamRemoteCall gesendet.
  3. Auf der Serverseite:
    1. Stellt ein Client eine Verbindung zum Server-Socket her, wird ein neuer Thread zur Bearbeitung des eingehenden Aufrufs zugeordnet. Der ursprüngliche Thread kann weiterhin am ursprünglichen Socket empfangsbereit sein, sodass zusätzliche Aufrufe von weiteren Clients erfolgen können.
    2. Vom Server werden die Kopfzeileninformationen und ein eigenes RemoteCall-Objekt erstellt, um das Unmarshaling der RMI-Argumente vom Socket auszuführen.
    3. Mit der Methode serviceCall() der Klasse Transport wird der eingehende Aufruf zugeteilt.
    4. Durch die Methode dispatch() wird die geeignete Methode des Objekts aufgerufen und das Ergebnis mit Push in der Verbindung rückübermittelt.
    5. Wird vom Serverobjekt eine Ausnahmebedingung ausgelöst, wird sie vom Server abgefangen und ein Marshaling dafür ausgeführt. Dabei wird sie statt des Rückgabewerts über die Verbindung übermittelt.
  4. Zurück auf der Clientseite:
    1. Für den Rückgabewert der RMI wird ein Unmarshaling ausgeführt und er wird vom Stub an den Client-Code selbst zurückgegeben.
    2. Wird vom Server eine Ausnahmebedingung ausgelöst, wird für diese ein Unmarshaling ausgeführt und sie wird vom Stub ausgelöst.