- Ausführung von Methoden auf einem entfernten Rechner
- Prinzip:
- Eingabeparameter werden über eine Netzverbindung
zu einem (entfernten) Rechner geschickt
- die entsprechende Methode wird dort ausgeführt
- die Ergebnisse werden über die Netzverbindung
zurück geschickt
- Analogon zu Remote Procedure Call (RPC)
- schon viele Jahre im Einsatz
- RMI Spezialfall der allgemeinen Kommunikation
- Anstelle von expliziten Sende- und Empfangsoperationen
ein Methodenaufruf mit implizitem Senden und Empfangen
- aber allgemeine Kommunikation auch durch RMI nachbildbar
- Sendeoperation auf eine Methode
- Empfangsoperation auf eine zweite Methode
- Kommunikation eins Servers mit einem Client mittels "call-back"
- versenden von Objekten deren innere Zustände vom Server
modifiziert werden
- z.B. mit setValue und getValue
- Einige [6]
sind der Auffassung, daß Socket-Kommunikation
gänzlich überflüssig ist,
RMI alleine reicht und ist "besser objektorientiert"
- Andere [8],
sehen in wissenschaftlichen Codes doch einige Anwendungsfälle,
bei denen RMI alleine nicht ausreicht,
oder wo zumindest Socket-Kommunikation eine bessere Performance bietet
- Wieder Andere [7]
konzentrieren sich auf eine Optimierung der RMI- und
Serialisierungs-Implementierung
Abbildung 3:
Remote Method Invocation, JDK 1.1
|
RMI Architektur in Abbildung 3
- Computer 'A' bezeichnet den Rechner, von dem aus
eine Methode auf dem entfernten Rechner 'B' aufgerufen werden soll
- 'Client' bezeichnet den Benutzerprozess in Rechner A
- 'Server' bezeichnet den Prozeß, der die aufrufbare Methode
bereitstellt
weitere Bestandteile von RMI
- ein Verzeichnis, genannt 'Repository', der aufrufbaren Objekte
- dieses Repository muß vor beginn aller
RMI Aktivitäten gestartet sein
- Server verwenden
rmi.Naming.bind() oder rmi.Naming.rebind(),
um ein Objekt unter einem Namen bei dem Repository zu registrieren
- Clients sehen mit
rmi.Naming.lookup() bei dem Repository nach ob ein
gewünschtes Objekt vorhanden ist machen es lokal zugänglich
- beim Aufruf im Client wird zunächst ein sogenanntes
'Stub' Objekt aktiviert
- diese sendet die Eingabeparameter an ein 'Skeleton' genanntes
Objekt auf dem Server (JDK 1.1)
- das Skeleton Objekt ruft dann auf dem
Rechner B die gewünschte Methode auf
- der Returnwert wird nach der Terminierung der
Methode an das Stub Objekt zurück geschickt
- dieses übergibt den Wert dann
an das aufrufende Objekt
- der Einsatz von Stub und Skeleton erfolgt transparent
- mit JDK 1.2 wird kein Skeleton mehr benötigt
Die wesentlichen Schritte der RMI-Kommunikation:
- Eine entfernte Klasse muß ein definiertes Interface haben,
das das Remote-Interface erweitert.
Alle Remote-Methoden müssen RemoteExceptions
auslösen können.
- Zu dem Interface muß eine
passende Implementierung existieren.
- Mit Hilfe des RMI-Compilers rmic müssen
aus der Remote-Implementierung die entsprechenden
Klassen für Stub und Skeleton abgeleitet werden.
Mit JDK 1.2 wird kein Skeleton mehr benötigt.
- Das RMI Repository, ein Verzeichnis von Server-Methoden,
muß mit dem Daemon
rmiregistry aktiviert und gestartet werden.
- Ein Serverprozess muß ein Exemplar object der
Remote-Klasse erzeugen und mit
rmi.Naming.bind(
"name",
object)
beim Repository anmelden.
- Der Clientprozeß muß ein lokales Exemplar
Interface object
des Remote- Interfaces erzeugen. Dies geschieht
mit
(Interface)
rmi.Naming.lookup( "rmi://host/method" )
- Alle Remote-Methoden dieser Instanz können dann mit
result = object.method(parm) wie
lokale Methoden verwendet werden.
Mit Java 2, aka JDK 1.2, gibt es ein ausgefeiltes
und flexibles Sicherheitsmanagement
- der RMI Server muß einen speziellen RMISecurityManager()
installieren
- greift bei RMI-Anfragen auf eine Datei mit der Spezifikation der
Sicherheitsrestriktionen zurück
- und entscheidet ob ein bestimmter Client die Methode aufrufen
darf oder nicht
eine Datei die alles erlaubt:
grant {
permission java.security.AllPermission;
};
eine Datei die von Überall den Zugang nur über die Ports 4000-5000
erlaubt:
grant {
permission java.net.SocketPermission "*:4000-5000", "connect,accept";
};
- Java-Hilfsmittel zur Programmierung der Kommunikation
zwischen Prozessen
- Socket-Kommunikation und ChannelFactory
- Remote Method Invocation (RMI)
- meist in Client-Server-Schema gepresst
© Universität Mannheim, Rechenzentrum, 2000-2002.
Last modified: Sun Jun 23 22:15:55 MEST 2002