2009-04-21 4 views
5

Sobald ich eine RMI-Kommunikationsverbindung zwischen zwei Systemen eingerichtet habe, kann ich ein Objekt übergeben, das "Remote" in eine der Remotemethoden implementiert, die ein Objekt dieses Typs und des Gegen-Endes verwendet Holen Sie einfach die Remote-Schnittstelle für das neue Objekt (mit anderen Worten, es wird eine neue Remote-Verbindung im Gegensatz zu nur Serialisierung des Objekts über.)RMI - Wie funktioniert die Weitergabe eines Remote-Objekts über eine Remote-Methode?

Ist das korrekt?

Wenn ja, nehme ich an, dass dies etwas mit den Methodensignaturen zu tun hat - aber ich würde gerne genau wissen, wie es bestimmt, dass es ein neues entferntes Objekt erstellen sollte, anstatt einfach das gesamte Objekt zu serialisieren.

Das ist wirklich schwer in Worte zu fassen. Lass es mich versuchen:

Angenommen, ich habe einen Client und ein Serversystem. Auf dem Serversystem erstelle und veröffentliche ich ein RMI-Objekt, auf dem Client-System erhalte ich die Schnittstelle und kann mit dem Server-System interagieren.

Client       Server 
Object1 RemoteIface  ---- Object1 Implementation 

So weit so gut. Auf dem Client wird Object1.remoteMethod() auf dem Server ausgeführt (nach der Serialisierung über die Parameter).

Nun, hier ist die Frage, auf dem Client-I Ausführen von Code wie folgt aus:

Object2 object2=new object2(); // Also a remote object 
object1.send(object2); 

Wie ich es verstehe, an diesem Punkt, wird mein System einen Mechanismus neue Kommunikations haben:

Client       Server 
Object1 RemoteIface ----- Object1 Implementation 
Object2 Implementation ----- Object2 RemoteIface  

Wenn der Server zu diesem Zeitpunkt eine Methode für Object2 aufruft, wird diese Methode tatsächlich auf dem Client ausgeführt.

Ich frage mich, an welchem ​​Punkt das System entscheidet, dies zu tun, anstatt nur serialisieren (wie es mit einem nicht-Remote-Objekt).

Oder bin ich völlig falsch und es nur serialisiert es über und ich brauche eine Art "getRemoteInterface()" Methodenaufruf, um tatsächlich den Remote-Aufruf zu erstellen?

Antwort

6

Es ist, was die Proxy Pattern genannt wird. Die am fernen Ende instantiierte Sache hat einen Code erzeugt, um Werte zu übertragen und Methoden zu aktivieren.

java.rmi.Remote selbst ist nur eine "Tagging-Schnittstelle". Sie benötigen eine Implementierung, um die eigentliche Arbeit zu erledigen. Werfen Sie einen Blick auf this JavaCamp tutorial für mehr.

Update: Okay, geh in die andere Richtung, ja, Sie müssen das Objekt serialisieren und übergeben, wenn über den Draht. Wahrscheinlich ist das Beste, zuerst die Java Tutorial on RMI zu bearbeiten. Aber im Grunde ist Serializable eine weitere Tagging-Schnittstelle, die Java mitteilt, dass das Objekt bereit ist, in ein internes String-Format umgewandelt zu werden, ähnlich wie XML oder YAML. Dieses Format kann auf der Empfängerseite in ein passendes Objekt "rehydriert" werden, solange die Klassendateien für dieses Objekt verfügbar sind.

+0

Ich bin mir nicht sicher, ob Sie verstanden haben. Ich werde versuchen, es umzuformulieren ... –

+1

Es hört sich an, als würde Charlie Ihre Frage genau so interpretieren, wie ich es tat, und ist mit seiner Antwort genau im Ziel. Wenn Sie einen Parameter übergeben (oder ein Objekt zurückgeben), der Remote implementiert, wird ein dynamisches Proxy-Gerüst erstellt, und Endpunktinformationen, die dieses Skelett adressieren, werden gesendet (eine Art "Referenz" und nicht "Wert"). Am Empfänger wird ein dynamischer Proxy-Stub erstellt, um mit dem Remote-Objekt zu kommunizieren. Die Entscheidung, Remote statt Serialisierung durchzuführen, basiert auf der Remote-Schnittstelle. – erickson

+0

Okay, es klingt, als ob du es richtig hinbekommen hast und ich habe einfach eine Menge Zeit damit verschwendet, meine Frage neu zu schreiben. Aber könnten Sie im Bereich "RemoteInterface" expliziter sein? Wenn ich es einfach auf die Remote-Schnittstelle umsetze, wird es dann die Schnittstelle von der Implementierung trennen oder muss es den Methodenaufruf durchlaufen? –

Verwandte Themen