Die Remote Method Invocation besteht aus drei Ebenen: Der Ebene der Stubs/Skeletons, der Ebene der Remote References und der Transportebene. Der Aufbau dieser Ebenen ist in Abb. 11-2 angegeben. Ruft ein Client eine entfernte Methode auf, so beginnt die Abarbeitung des Aufrufs in den Stubs des Clients. Der Client verwendet hierbei einen Stub als Platzhalter für das entfernte Objekt. Dies impliziert, dass alle Schichten, die in der Abbildung unterhalb der Stubs angeordnet sind, für den Client unsichtbar sind. Stub-Code wird mittels des Compilers rmic erzeugt und verwendet die Remote-Reference-Schicht (RRL), um Methodenaufrufe an das Server-Objekt zu übergeben. Abb. 11.2: Architektur von RMI Ruft ein Client eine entfernte Methode auf, so beginnt die Abarbeitung des Aufrufs in den Stubs des Clients. Der Client verwendet hierbei einen Stub als Platzhalter für das entfernte Objekt. Dies impliziert, dass alle Schichten, die in der Abbildung unterhalb der Stubs angeordnet sind, für den Client unsichtbar sind. Stub-Code wird mittels des Compilers rmic erzeugt und verwendet die Remote-Reference-Schicht (RRL), um Methodenaufrufe an das Server-Objekt zu übergeben. Skeleton-Komponente Ein Skeleton ist auf Server-Seite die Komponente, die mit der RRL der Server-Seite interagiert. Hierbei erhält ein Skeleton Anforderungen von Methodenaufrufen von der RRL auf Client-Seite, zusammen mit den hierzu notwendigen Argumenten. Das Skeleton extrahiert diese Argumente und ruft die geeignete Methode beim Server auf. Nachdem eine Methode abgearbeitet ist, nimmt das Skeleton eventuelle Rückgabewerte der Methode entgegen und verpackt diese wieder. Stub-Komponenten Ein Stub ist ein Platzhalter beim Client, der ein entferntes Objekt repräsentiert. Stubs definieren hierzu die Interfaces, die zur Unterstützung der Implementierung des entfernten Objekts notwendig sind. Ein Stub wird wie jedes andere lokale Objekt referenziert, das auf der Maschine des Clients läuft. Aufgrund dieser Funktion ist ein Stub sowohl ein lokales Objekt, das beim Client läuft, als auch eine Verbindung zum Objekt, das beim Server ausgeführt wird. Die RRL auf Client-Seite gibt jeweils einen Strom aus Objekten und Argumenten an den Stub zurück. Ein derartiger Strom wird von der RRL benötigt, um mit der RRL auf der Server-Seite kommunizieren zu können. Zur Erzeugung eines Stroms serialisiert ein Stub Parameterdaten und übergibt diese an den Strom. Nachdem eine entfernte Methode abgearbeitet ist, gibt die RRL serialisierte Rückgabewerte an den Stub zurück, der in der Folge diese Objekte wieder deserialisieren muss. Remote-Reference-Schicht Die Remote-Reference-Schicht (RRL) stellt ein Referenzierungsprotokoll dar, das unabhängig von Stub- oder Skeleton-Modellen arbeitet. Aufgrund dieser Flexibilität ist es leicht möglich, die RRL zu verändern, ohne dass die anderen Schichten von der Änderung betroffen sind. Als Schnittstelle interagiert die RRL mit der Transportschicht und mit Stubs bzw. mit dem Skeleton. Grundsätzlich werden RRLs auf der Server-Seite und auf der Client-Seite verwendet, die mit der Transportschicht kommunizieren. Die Client-Seite enthält hierbei Informationen, die für den entfernten Server spezifisch sind. Diese Information wird der RRL auf der Server-Seite übergeben und hängt daher ausschließlich von der RRL der Server-Seite ab. Diese RRL stellt die Referenzierungssemantik zur Verfügung und verarbeitet Daten nach dieser Semantik, bevor sie an das Skeleton übergeben werden, um eine Methode aufzurufen. Die Transportschicht verbindet zwei RRLs und regelt daher deren Kommunikation. Transportschicht Aufgabe der Transportschicht ist es, Verbindungen zwischen Client und Server zu verwalten. Die Transportschicht realisiert die folgenden Abstraktionen: Endpunkt Ein Endpunkt wird verwendet, um den Adressraum zu referenzieren, der eine VM enthält. In dieser Funktion ist ein Endpunkt eine Referenz zu einer spezifischen Transportinstanz. Kanal Ein Kanal ist eine Verbindung zwischen zwei Adressräumen. Ein Kanal ist für die Verwaltung jeder Verbindung zwischen Client und Server verantwortlich. Verbindung Eine Verbindung wird als Abstraktion für den Datentransfer zwischen Client und Server (Argumente und Rückgabewerte) verwendet. Transport Die Transportabstraktion regelt den Aufbau eines Kanals zwischen einem lokalen Adressraum und einem entfernten Endpunkt. Eine weitere Aufgabe besteht im Akzeptieren eingehender Verbindungsanforderungen zu dem Adressraum, der die Abstraktion enthält. Die Transportschicht erstellt Verbindungen, verwaltet existierende Verbindungen und verarbeitet entfernte Objekte, die in ihrem Adressraum enthalten sind. Erhält die Transportschicht eine Anforderung von der RRL auf der Client-Seite, so wird eine Socket-Verbindung zum Server aufgebaut. Anschließend übergibt die Transportschicht die aufgebaute Verbindung an die RRL auf der Client-Seite und fügt eine Referenz auf ein entferntes Objekt einer intern verwalteten Tabelle hinzu. Zu diesem Zeitpunkt ist der Client mit dem Server verbunden. Eine weitere Aufgabe der Transportschicht besteht darin, das Fortbestehen der Verbindung zu überwachen. Vergeht eine signifikante Zeitspanne, ohne dass Daten über die Verbindung übertragen werden, so veranlasst die Transportschicht den Abbau der Verbindung. Die Zeit, die hierbei verstreicht, ist standardmäßig auf 10 Minuten eingestellt.