Implementacja RMI
Implementacja RMI składa się z trzech warstw abstrakcji.
Te warstwy abstrakcji są następujące:
- Warstwa Stub and Skeleton , która przechwytuje wywołania metody wykonywane przez klienta do zmiennej odwołania do interfejsu i przekierowuje te wywołania do zdalnej usługi RMI.
- Warstwa Remote Reference (Remote Reference) rozumie sposób interpretacji i zarządzania odwołaniami od klientów do obiektów usług zdalnych.
- Warstwa dolna jest warstwą Transport , która jest oparta na połączeniach TCP/IP między maszynami w sieci. Zapewnia on podstawową łączność, jak również niektóre strategie penetracji zapory firewall.

W górnej części warstwy TCP/IP RMI korzysta z protokołu na poziomie łącznika o nazwie Java™ Remote Method Protocol (JRMP), który działa w następujący sposób:
- Obiekty, które wymagają zachowania zdalnego, powinny rozszerzać klasę RemoteObject , zwykle za pomocą podklasy UnicastRemoteObject .
- Podklasa UnicastRemoteObject eksportuje zdalny obiekt, aby udostępnić go do obsługi przychodzących wywołań RMI.
- Eksportowanie obiektu zdalnego tworzy nowe gniazdo serwera, które jest powiązane z numerem portu.
- Tworzony jest również wątek, który nasłuchuje połączeń na tym gnieździe. Serwer jest zarejestrowany w rejestrze.
- Klient uzyskuje szczegółowe informacje na temat nawiązywania połączenia z serwerem z rejestru.
- Korzystając z informacji z rejestru, która zawiera nazwę hosta i szczegóły portu gniazda nasłuchującego serwera, klient łączy się z serwerem.
- Gdy klient wysyła do serwera zdalne wywołanie metody, tworzy obiekt TCPConnection , który otwiera gniazdo na serwerze w podanym porcie i wysyła informacje nagłówka RMI oraz argumenty zestawione za pośrednictwem tego połączenia przy użyciu klasy StreamRemoteCall .
- Po stronie serwera:
- Gdy klient łączy się z gniazdem serwera, nowy wątek jest przypisywany do połączenia przychodzącego. Oryginalny wątek może kontynuować słuchanie oryginalnego gniazda, tak aby można było wykonać dodatkowe wywołania od innych klientów.
- Serwer odczytuje informacje nagłówkowe i tworzy obiekt RemoteCall , który jest właścicielem, aby zająć się unmarshowaniem argumentów RMI z gniazda.
- Metoda serviceCall() usług klasy Transport przychodzących wywołań przez rozsyłanie jej
- Metoda dispatch() wywoła odpowiednią metodę na obiekcie i wypycha wynik z powrotem w dół łącznika.
- Jeśli obiekt serwera zgłosi wyjątek, serwer przechwyci go i zestawiło go w dół zamiast wartości zwracanej.
- Z powrotem po stronie klienta:
- Wartość zwracana RMI jest unmarshalled i zwracana z kodu pośredniczącego z powrotem do samego kodu klienta.
- Jeśli wyjątek jest zgłaszany z serwera, to jest on unmarshalled i zgłaszany z kodu pośredniczącego.