6

強力なコードモビリティのためにJavaを使用する方法を知っている人はいますか?あなたは前にそれをしたことがありますか?

これが私が達成しようとしていることです。

ネットワークを介して通信する2つの別個のJavaアプリケーションがあるとします。アプリAとアプリB。

アプリAには、オブジェクトとしてインスタンス化されたクラスxがあり、それを使用しています。アプリBには、このクラスxに関する予備知識がありません。

アプリAは、クラスxのインスタンスをアプリBに移行する必要があります。アプリBは、クラスxを動的にロードでき、クラスxの状態を保持できる必要があります。

私はグーグルで調べて、実行時にクラスを動的にロードする方法に関するたくさんのリソースを見つけました。ただし、オブジェクトインスタンスをその状態とともにネットワーク経由で転送し、動的に呼び出すメカニズムがカバーされているかどうかはわかりません。

どんなポインタも非常に役に立ちます、そして前もってありがとう!

注:私は主に、この問題を解決するために使用されるものではなく、この問題をどのように解決する(つまり、アプローチ、考え方)に関心があります。これは、この問題を解決するための独自の解決策を考え出すことが私に課せられているためです。ライブラリ/フレームワークを指摘することは素晴らしいことですが、以前にこのようなことをしたことがある人から回答が投稿されれば理想的です(ただしまれですが)。

4

6 に答える 6

2

強いモビリティについて質問しますが、要件は弱いモビリティで満たされます。これには、RMIプロトコルによっていくつかの制限があります。RMIは、RPC、オブジェクトのシリアル化、分散オブジェクトグラフをサポートするだけでなく、クライアントがサーバーにのみ認識されているクラスのバイトコードをロードしてそのバイトコードをローカルで実行できるようにするために通常使用されるコード共有もサポートします。

強力なモビリティはJavaでサポートされておらず、VMに独自の拡張機能を作成せずにそれを実装する方法を考えることはできません。基本的に、Javaコンテキストでの強力なモビリティは、1つのVMでスレッドを一時停止または一時停止し、そのスレッドから到達可能なすべてのオブジェクトインスタンスを転送し、実行に必要なバイトコードと内部スレッドst(コールスタックなど)を別のVMを作成し、スレッドの状態を再作成して、元のVMでスレッドが一時停止された時点で実行を続行します。

于 2009-11-17T18:05:46.320 に答える
1

上記のように、コードモビリティをサポートするオープンソースライブラリを作成しました。実際には、RPCタイプの使用法もサポートしています。

参照:Mobility-RPC-Javaプラットフォーム用のシームレスなコードモビリティとRPC

これが弱い機動性と強い機動性のどちらに当てはまるかという点では、真ん中です。

オブジェクトをリモートマシンに転送するとき、オブジェクトのどのメソッドが呼び出されるか、およびオブジェクトがリモートマシンに到着するときにどの引数を使用するかを制御できます。したがって、モバイルエージェントを作成している場合は、転送する前に次のマシンで実行を再開する方法を自分で決定できます。同じ場所から再開する必要はありません。

于 2012-02-21T19:33:14.957 に答える
0

クラスCのインスタンスIを移動するには、AからBに2つのものを転送する必要があります。

最初にCのクラス定義(通常はバイトコードのリストの形式)、次にIのシリアル化された形式。古いバイナリシリアル化の代わりにXMLシリアル化を使用する必要があることに注意してください。

本当にトリッキーな部分は、Cのすべてのスーパークラスに加えて、すべてのリターンタイプとフィールドタイプ、およびそれらのスーパークラスとリターン/フィールドタイプなどを本質的に転送する必要があるため、Cの依存関係を転送することです。

Cのすべての可能な値に対してこれを本当に行う必要がある場合、最善の策は、グリッド1またはテラコッタのようにこれを行うように設計されたフレームワークを使用することです。たとえば、特定の狭いインターフェイスに自分自身を制限できる場合は、おそらくはるかに優れています。また、プロパティは非常に単純であり、遠くまで行くことができるため、このためにプロパティを使用することも検討してください。

于 2009-11-17T18:33:20.600 に答える
0

通常の Java では、アプリ B にオブジェクトのクラスをロードさせる何らかの方法が必要です。次に、オブジェクトをアプリ A からアプリ B にシリアル化する必要があります。クラスが中央の場所で利用できる場合は、おそらくこれを行うことができます。 HTTP サーバーなど。しかし、完全に新しいオブジェクトをアプリ B に転送する一般的なケースでは、独自のクラスローダーを実装する (またはこれを行うライブラリを見つける) 必要があります。

すべてのオブジェクトが Serializable であり、クラスを格納するための中央の場所がある場合、これを実装するのはかなり簡単です。URLClassLoader を使用して http サーバーからクラスをロードし、通常の Java シリアライゼーションを使用してシリアライズされたオブジェクトを転送できます。B がロードするクラスを認識し、A がいつオブジェクトを送信するかを認識し、B がオブジェクトのメソッドの実行を継続する方法を認識できるように、アプリ A と B 間の調整が必要になります。このアプローチでは、オブジェクト X がメソッドを実行中である可能性はおそらくありません。アプリ A と連携して実行を停止し、再開する必要があります。

于 2009-11-17T17:52:09.233 に答える
0

ネットワーク上でオブジェクトを動的に移動できるcajoというプロジェクトがあります。ただし、実行状態についてはわかりません。

于 2009-11-17T17:48:20.677 に答える
-2

JDK6 を使用している場合は、ソース コードを送信してコンパイルできます。これにより、動的にコンパイルされたので、クラスローダーがこの新しいクラスを見つけることができます。

秘訣は、これをアプリケーションにロードするために何らかの DI を使用する必要がある場合があるため、動的に機能する DI フレームワークが必要になることです。

次に、それがクラスに注入されるときに、その時点でプロパティを設定します。

これらには、既知のインターフェイスが必要です。両方が依存できる契約が必要です。

私はそれを試していませんし、Java がこれに適した言語だとは思いません。この機能が必要な場合は、jvm スクリプト言語の 1 つまたは Clojure のようなものを見たいと思うかもしれません。すべてjvmで実行されます。

アップデート:

これは、多くの人が慣れていない可能性があるため、JDK5を使用したオンザフライコンパイルに関するリンクです。

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

于 2009-11-17T18:10:08.413 に答える