RMI (Remote Method Invocation)
Der RMI (Remote Method Invocation) ist eine API, die einen Mechanismus zum Erstellen verteilter Anwendungen in Java bereitstellt. Das RMI ermöglicht es einem Objekt, Methoden für ein Objekt aufzurufen, das in einer anderen JVM ausgeführt wird.
Das RMI ermöglicht die Fernkommunikation zwischen den Anwendungen über zwei Objekte stub und Skeleton.
Verständnis von Stub und Skelett
RMI verwendet Stub- und Skelettobjekte für die Kommunikation mit dem Remote-Objekt.
Ein Remote-Objekt ist ein Objekt, dessen Methode von einer anderen JVM aus aufgerufen werden kann. Lassen Sie uns die Stub- und Skeleton-Objekte verstehen:
Stub
Der Stub ist ein Objekt und fungiert als Gateway für die Clientseite. Alle ausgehenden Anfragen werden durch sie geleitet. Es befindet sich auf der Clientseite und repräsentiert das Remote-Objekt. Wenn der Aufrufer die Methode für das Stub-Objekt aufruft, führt er die folgenden Aufgaben aus:
- Es initiiert eine Verbindung mit Remote Virtual Machine (JVM),
- Es schreibt und überträgt (marshallt) die Parameter an die Remote Virtual Machine (JVM),
- Es wartet auf das Ergebnis
- Es liest (unmarshals) den Rückgabewert oder die Ausnahme und
- Es gibt schließlich der Wert für den Aufrufer.
Skelett
Das Skelett ist ein Objekt, fungiert als Gateway für das serverseitige Objekt. Alle eingehenden Anfragen werden durch sie geleitet. Wenn das Skelett die eingehende Anforderung empfängt, führt es die folgenden Aufgaben aus:
- Es liest den Parameter für die Remote-Methode
- Es ruft die Methode für das tatsächliche Remote-Objekt auf und
- Es schreibt und überträgt (marshallt) das Ergebnis an den Aufrufer.
Im Java 2 SDK wurde ein Stub-Protokoll eingeführt, das Skelette überflüssig macht.
Anforderungen für verteilte Anwendungen verstehen
Wenn eine Anwendung diese Aufgaben ausführt, kann sie eine verteilte Anwendung sein.
.
- Die Anwendung muss die Remote-Methode lokalisieren
- Sie muss die Kommunikation mit den Remote-Objekten bereitstellen, und
- Die Anwendung muss die Klassendefinitionen für die Objekte laden.
Die RMI-Anwendung verfügt über alle diese Funktionen und wird daher als verteilte Anwendung bezeichnet.
Java RMI-Beispiel
Die 6 Schritte zum Schreiben des RMI-Programms sind angegeben.
- Erstellen Sie die Remote-Schnittstelle
- Stellen Sie die Implementierung der Remote-Schnittstelle bereit
- Kompilieren Sie die Implementierungsklasse und erstellen Sie die Stub- und Skeleton-Objekte mit dem rmic-Tool
- Starten Sie den Registrierungsdienst mit dem rmiregistry-Tool
- Erstellen und starten Sie die Remote-Anwendung
- clientanwendung
RMI-Beispiel
In diesem Beispiel haben wir alle 6 Schritte zum Erstellen und Ausführen der RMI-Anwendung ausgeführt. Die Client-Anwendung benötigt nur zwei Dateien, Remote-Schnittstelle und Client-Anwendung. In der RMI-Anwendung interagieren sowohl Client als auch Server mit der Remote-Schnittstelle. Die Clientanwendung ruft Methoden für das Proxy-Objekt auf, RMI sendet die Anforderung an die Remote-JVM. Der Rückgabewert wird an das Proxy-Objekt und dann an die Clientanwendung zurückgesendet.
1) Erstellen Sie die Remote-Schnittstelle
Erweitern Sie zum Erstellen der Remote-Schnittstelle die Remote-Schnittstelle und deklarieren Sie die RemoteException mit allen Methoden der Remote-Schnittstelle. Hier erstellen wir eine Remote-Schnittstelle, die die Remote-Schnittstelle erweitert. Es gibt nur eine Methode namens add() und sie deklariert RemoteException .
2) Geben Sie die Implementierung der Remote-Schnittstelle an
Geben Sie nun die Implementierung der Remote-Schnittstelle an. Um die Implementierung der Remote-Schnittstelle bereitzustellen, müssen wir
- Entweder die UnicastRemoteObject-Klasse
- erweitern oder die exportObject() -Methode der UnicastRemoteObject-Klasse
Falls Sie die UnicastRemoteObject-Klasse erweitern, müssen Sie einen Konstruktor definieren, der RemoteException deklariert.
3) Erstellen Sie die Stub- und Skeleton-Objekte mit dem rmic-Werkzeug.
Der nächste Schritt besteht darin, Stub- und Skeleton-Objekte mit dem rmi-Compiler zu erstellen. Das rmic-Tool ruft den RMI-Compiler auf und erstellt Stub- und Skeleton-Objekte.
4) Starten Sie den Registrierungsdienst mit dem rmiregistry-Tool
Starten Sie nun den Registrierungsdienst mit dem rmiregistry-Tool. Wenn Sie die Portnummer nicht angeben, wird eine Standardportnummer verwendet. In diesem Beispiel verwenden wir die Portnummer 5000.
5) Erstellen und Ausführen der Serveranwendung
Jetzt müssen RMI-Dienste in einem Serverprozess gehostet werden. Die Benennungsklasse stellt Methoden zum Abrufen und Speichern des Remote-Objekts bereit. Die Benennungsklasse bietet 5 Methoden.
öffentliche statische Java.rmi.Remotesuche (java.lang.String) wirft java.rmi.NotBoundException, java.net.MalformedURLException, java.rmi.RemoteException; | Es gibt die Referenz des Remote-Objekts zurück. |
öffentliche statische leere Bindung (java.lang.Zeichenfolge, Java.rmi.Remote) wirft Java.rmi.AlreadyBoundException, java.net.In: MalformedURLException, java.rmi.RemoteException; | Es bindet das Remote-Objekt mit dem angegebenen Namen. |
öffentliche statische leere unbind(java.lang.String) wirft java.rmi.RemoteException, Java.rmi.NotBoundException, java.net.MalformedURLException; | Es zerstört das entfernte Objekt, das mit dem angegebenen Namen gebunden ist. |
öffentliche statische leere rebind(java.lang.Zeichenfolge, Java.rmi.Remote) wirft Java.rmi.RemoteException, java.net.MalformedURLException; | Es bindet das Remote-Objekt an den neuen Namen. |
öffentliche statische Java.lang.String-Liste(java.lang.String) wirft java.rmi.RemoteException, java.net.MalformedURLException; | Es gibt ein Array der Namen der in der Registrierung gebundenen Remote-Objekte zurück. |
In diesem Beispiel binden wir das Remote-Objekt mit dem Namen sonoo.
6) Erstellen und Ausführen der Client-Anwendung
Auf dem Client erhalten wir das Stub-Objekt mit der lookup() -Methode der Benennungsklasse und rufen die Methode für dieses Objekt auf. In diesem Beispiel führen wir die Server- und Client-Anwendungen auf demselben Computer aus, sodass wir localhost verwenden. Wenn Sie von einem anderen Computer aus auf das Remoteobjekt zugreifen möchten, ändern Sie localhost in den Hostnamen (oder die IP-Adresse), auf dem sich das Remoteobjekt befindet.
Ausgabe dieses RMI-Beispiels
Aussagekräftiges Beispiel einer RMI-Anwendung mit Datenbank
Betrachten Sie ein Szenario, in dem zwei Anwendungen auf verschiedenen Computern ausgeführt werden. Nehmen wir an, MachineA und MachineB, machineA befindet sich in den USA und MachineB in Indien. MachineB möchte eine Liste aller Kunden der MachineA-Anwendung erhalten.
Lassen Sie uns die RMI-Anwendung entwickeln, indem Sie die Schritte ausführen.
1) Erstellen Sie die Tabelle
Zunächst müssen wir die Tabelle in der Datenbank erstellen. Hier verwenden wir die Oracle10-Datenbank.
2) Erstellen Sie Kundenklasse und Remote-Schnittstelle
Datei: Kunde.java
Hinweis: Die Kundenklasse muss serialisierbar sein.
Datei: Bank.java
3) Erstellen Sie die Klasse, die die Implementierung der Remote-Schnittstelle bereitstellt
Datei: BankImpl.java
4) Kompilieren Sie die Klasse rmic tool und starten Sie den Registrierungsdienst von rmiregistry tool
5) Erstellen und Ausführen der Server
Datei: MyServer.java
6) Erstellen und Ausführen der Client
-Datei: MyClient.java