2009-11-17 12 views
6

Kann jemand Java für Strong code mobility verwenden? Hast du es schon einmal gemacht?Java: Starke Code-Mobilität Wie?

Hier ist was ich versuche zu erreichen.

Angenommen, wir haben zwei separate Java-Anwendungen, die über das Netzwerk kommunizieren. App A und App B.

App A hat eine Klasse x instanziiert als ein Objekt, und hat es verwendet. App B hat keine Vorkenntnisse in dieser Klasse x.

App A braucht die Instanz der Klasse x auf über App B. App B wandern sollte dynamisch Lage zu Klasse X geladen, und behält den Zustand der Klasse x.

Ich habe gegoogled herum und fand eine Reihe von Ressourcen zum dynamischen Laden der Klasse zur Laufzeit. Ich bin mir jedoch nicht sicher, ob der Mechanismus der Übertragung einer Objektinstanz über das Netzwerk mit seinem Status und dessen dynamischer Aufruf abgedeckt ist.

Alle Hinweise wären sehr hilfreich, und vielen Dank im Voraus!

HINWEIS: Ich bin meistens interessiert in wie (das heißt der Ansatz, so zu denken) wurde dieses Problem gelöst ist, nicht was verwendet wird, dieses Problem zu lösen; Das liegt daran, dass ich beauftragt wurde, meine eigene Lösung zu finden, um dieses Problem zu lösen. Obwohl das Aufzeigen von Bibliotheken/Framework großartig ist, wäre es ideal, wenn Antworten von Leuten gepostet werden, die so etwas schon einmal gemacht haben (wie selten).

+0

Klingt interessant! Wenn ich überhaupt über dieses Thema informiert wäre, würde ich dies als Antwort veröffentlichen, aber ich werde es stattdessen als Kommentar veröffentlichen. Könnten Sie das Objekt übertragen, indem Sie zuerst die serialisierte Klassendefinition laden, dann laden Sie das Objekt in die Assembly und senden dann das tatsächliche Objekt und laden es dann unter Verwendung der Klassendefinition (siehe Reflexion, falls nicht). Das wäre verdammt cool! – Zoidberg

+0

Ich löschte meine Antwort, da klar ist, dass ich etwas vorlesen sollte, bevor ich an der Lippe abrenne. Das heißt, ich glaube, es gibt einen Fall für das vereinfachte Design von bewegten Daten im Gegensatz zu Code. Wenn Sie jedoch verteilte zeitkritische Operationen ausführen, ist die Code-Mobilität möglicherweise ideal. – Cliff

Antwort

0

Es gibt ein Projekt namens cajo, das Objekte dynamisch über das Netzwerk verschieben kann. Ich bin mir jedoch nicht sicher über den Ausführungsstatus.

0

In normalen Java benötigen Sie eine Möglichkeit, App B die Klasse für das Objekt zu laden, dann müssen Sie das Objekt von App A zu App B serialisieren. Sie könnten dies vielleicht tun, wenn die Klassen verfügbar sind an einem zentralen Ort wie einem HTTP-Server. Aber im allgemeinen Fall, in dem Sie ein komplett neues Objekt in App B übertragen möchten, müssen Sie einen eigenen Classloader implementieren (oder eine Bibliothek finden, die das tut).

Wenn alle Ihre Objekte serialisierbar sind und Sie einen zentralen Speicherort für die Klassen haben, sollte dies relativ einfach zu implementieren sein. Sie können den URLClassLoader verwenden, um Klassen von einem HTTP-Server zu laden, und dann die normale Java-Serialisierung, um sie über das serialisierte Objekt zu übertragen. Eine gewisse Koordination zwischen den Anwendungen A und B wäre erforderlich, so dass B weiß, welche Klasse zu laden ist und A weiß, wann das Objekt gesendet werden muss, und B weiß, wie die Ausführung der Methoden des Objekts fortgesetzt wird. Bei diesem Ansatz gibt es wahrscheinlich keine Möglichkeit für das Objekt X, eine Methode auszuführen; es müsste stoppen und dann seine Ausführung in Zusammenarbeit mit App A starten.

2

Sie fragen nach starker Mobilität, aber Ihre Anforderungen werden mit schwacher Mobilität erfüllt, was mit einigen Einschränkungen durch das RMI-Protokoll zur Verfügung gestellt wird. RMI unterstützt nicht nur RPC, Objektserialisierung und verteilte Objektgraphen, sondern auch Code-Sharing, das normalerweise verwendet wird, so dass der Client den Bytecode von Klassen laden kann, die nur dem Server bekannt sind, und diesen Bytecode lokal ausführt.

Starke Mobilität wird von Java nicht unterstützt und ich kann mir keinen Weg vorstellen, sie zu implementieren, ohne proprietäre Erweiterungen der VM zu erstellen.Im Wesentlichen bedeutet starke Mobilität in einem Java-Kontext, dass Sie einen Thread in einer VM anhalten oder pausieren, alle aus diesem Thread erreichbaren Objektinstanzen, möglicherweise für die Ausführung benötigten Bytecode und den internen Thread st (Aufruf-Stack usw.) an a übertragen verschiedene VM und machen es den Thread-Status neu erstellen und die Ausführung an dem Punkt fortsetzen, wo der Thread in der ursprünglichen VM pausiert wurde.

-2

Wenn Sie JDK6 verwenden, können Sie den Quellcode senden, kompilieren, sodass der Klassenlader diese neue Klasse finden kann, da sie dynamisch kompiliert wurde.

Der Trick ist dann, dass Sie möglicherweise einige DI verwenden müssen, um diese in Ihre Anwendung zu laden, so dass Sie ein DI-Framework benötigen, das dynamisch arbeiten kann.

Dann, wenn es in Ihre Klasse injiziert wird, legen Sie die Eigenschaften an diesem Punkt fest.

Diese sollten eine bekannte Schnittstelle haben. Es muss einen Vertrag geben, auf den sich beide verlassen können.

Ich habe es nicht versucht, und ich glaube nicht, Java ist die richtige Sprache dafür. Wenn Sie diese Funktionalität haben müssen, sollten Sie sich etwas wie eine der jvm-Skriptsprachen oder Clojure ansehen, da ich davon ausgehe, dass dies auch funktionieren wird und Ihre Java-Anwendung dann mit diesem anderen dynamischen Framework interagieren wird alle laufen auf dem jvm.

UPDATE:

Hier ist ein Link auf on-the-fly-Compilierung, mit JDK5 wie es etwas, das viele Menschen mit nicht vertraut sind.

http://fivedots.coe.psu.ac.th/~ad/jg/javaArt1/index.html

0

Sie müssen zwei Dinge von A nach B übertragen, um

eine Instanz I der Klasse C zu bewegen

Zunächst wird die Klassendefinition von C (in der Regel in Form einer Liste von Byte-Codes) und dann die serialisierte Form von I. Bitte beachten Sie, dass Sie die XML-Serialisierung in der alten binären Serialisierung verwenden sollten.

Der wirklich schwierige Teil ist immer die Abhängigkeiten von C wie Sie im Wesentlichen müssen übertragen auch alle übergeordneten Klassen von C übertragen, plus die alle Rückgabetypen und Feldtypen und deren Oberklassen und zurück/Feldtypen usw. usw.

Wenn Sie dies wirklich für alle möglichen Werte von C tun müssen, verwenden Sie am besten einen Rahmen, der dafür ausgelegt ist, dies zu tun, wie Gitter oder Terrakotta. Wenn Sie sich z. eine gegebene und enge Schnittstelle, werden Sie wahrscheinlich viel besser sein. Denken Sie auch daran, nur Eigenschaften dafür zu verwenden, da sie sehr einfach sind und Sie weit bringen können.

1

Ich habe eine Open-Source-Bibliothek geschrieben, die Code Mobility genauso unterstützt wie oben beschrieben. Tatsächlich unterstützt es auch den RPC-Typ.

Siehe: Mobility-RPC - Seamless Code Mobility and RPC for the Java platform

In Hinblick darauf, wo diese steht auf schwache Mobilität im Vergleich zu starken Mobilität: in der Mitte.

Wenn Sie ein Objekt auf einen Remote-Computer übertragen, können Sie steuern, welche Methode auf dem Objekt aufgerufen wird und mit welchen Argumenten, wenn es auf dem Remote-Rechner ankommt.Wenn Sie also einen mobilen Agenten schreiben, kann er selbst entscheiden, wie er die Ausführung auf dem nächsten Rechner fortsetzen will, bevor er sich selbst überträgt. Er muss nicht von der gleichen Stelle aus fortfahren.