2

明らかな void set() および String get() メソッドを使用して、入力検証で Map を効果的に装飾する非常に単純な Java クラスがあります。

これらのメソッドを効果的に呼び出して、JVM の外部からの戻り値と例外を処理できるようにしたいのですが、それでも同じマシン上で更新します。私が念頭に置いている呼び出し元は別の JVM ではありません。ありがとう@デイブ・レイ

私の実装に関する考慮事項は典型的なものです

  • パフォーマンス
  • 実装と保守の容易さ (単純さ?)
  • 信頼性
  • 柔軟性 (つまり、リモート マシンから呼び出すことができるかなど)

「正しい方法」はありますか?そうでない場合、私のオプションは何ですか? また、それぞれの長所と短所は何ですか?

(人々が実際に行って、実際のフィードバックを提供できるものは素晴らしいでしょう!)

4

11 に答える 11

3

Ok。クライアントがJavaではないことがわかったので、もう一度試してみます。プロセス外アクセスと、場合によってはリモート マシン アクセスが必要なため、JNI は厳密にインプロセスであるため (そして完全に手間がかかるため)、必要なものではないと思います。その他のオプションは次のとおりです。

Raw Sockets : Java でリスナー ソケットをセットアップし、接続を受け入れるだけです。接続を取得したら、要求を読み取り、応答を返します。ほとんどすべての言語でソケットを使用できるため、これは非常に普遍的なソリューションです。ただし、独自のマーシャリング スキーム、解析などを定義する必要があります。

XML-RPC : 最近は流行りではありませんが、シンプルで効果的です。Java ライブラリと、他のほとんどの言語のライブラリがあり

CORBA : 前述のとおり、CORBA はオプションですが、かなり複雑であり、専門家を見つけるのが難しくなっています。

Web サーバー: アプリに組み込み Web サーバーをセットアップし、要求を処理します。Jettyについて良いことを聞いたことがあります。Java で提供されているものを使用することもできます。私は後者を使用して、Java で記述されたシミュレーションから KML ファイルを Google Earth にサーバーすることに成功しました。他のほとんどの言語には、HTTP リクエストを作成するためのライブラリがあります。データ (XML、テキストなど) をエンコードする方法は自由です。

Web サービス: これはもっと複雑だと思いますが、JAX-WSを使用してオブジェクトを Web サービスとして公開できます。NetBeans には、Web サービスを構築するための優れたツールがありますが、これはやり過ぎかもしれません。

于 2008-12-15T19:03:30.770 に答える
3

別の JVM ベースのシステムから呼び出しますか、それともクライアント言語は任意ですか? 別の JVM から呼び出している場合、最も簡単な方法の 1 つは、JMX を介してオブジェクトを MBean として公開することです。正規の Hello World MBean をここに示します。長所は次のとおりです。

  • 実装は実に簡単
  • 他の JVM からの呼び出しが非常に簡単
  • リモート マシンのサポート
  • jconsole を使用すると、クライアントを作成せずに MBean を手動でテストできます

短所:

  • クライアントはJVM上になければなりません(私は思う)
  • より複雑なデータ構造や相互作用には適していません。たとえば、MBean が別の MBean への参照を返すことはできないと思います。シリアル化してコピーを返します。
于 2008-12-15T16:07:40.077 に答える
2

呼び出し元は Java アプリではなく、ネットワーク化された呼び出し元を既に予測しているため、RMI-IIOP (CORBA)がオプションになる可能性があります。実装するのは簡単ではありませんが、広く認知されている標準であるという利点があります。

于 2008-12-15T16:25:31.290 に答える
2

呼び出し元は JVM ベースではないため、これは JVM とのプロセス間通信の問題です。私が考えているオプションは次のとおりです。

  1. ソケットを介した通信: JVM が着信接続をリッスンし、発信者がコマンドを送信するようにします。
  2. 共有ファイルを使用して通信する (呼び出し元のファイルへの書き込み、JVM のポーリングと更新)
  3. JNI を使用して、呼び出し側プロセス内で JVM を開始し、RMI/MBean を使用して最初の (「サーバー」) JVM と通信します。呼び出し元は、JNI を使用して結果にアクセスできます

オプション 3 IMO は、これを行う最も「Java」な方法であり、最も複雑でエラーが発生しやすい方法です。オプション 2 は醜いが単純です。オプション 1 は適度に簡単 (Java の部分) で、それ以外は問題ありません。

于 2008-12-15T16:30:22.060 に答える
1

Beanshell は、ネットワーク ソケットを介して公開できる、シェルに似た Java インタープリターです。基本的にはJavaからこれを行います:

i = new bsh.Interpreter();
i.set( "myapp", this );  // Provide a reference to your app
i.eval("server(7000)");

次に、他の場所からこれを行います。

telnet localhost 7001
myapp.someMethod();

この小さなユーティリティは、JNI や RMI よりもはるかに簡単にリモート Java 呼び出しを実行します。

詳細については、http: //www.beanshell.org/manual/remotemode.htmlから始めてください。

于 2009-10-08T22:55:52.343 に答える
1

使いやすさのために、 Spring Remotingを使用します。プロジェクトですでに Spring を使用している場合、それは簡単なことです。そうでない場合は、とにかく見てください。

Spring は、リモーティング プロトコルを簡単に切り替えることができる抽象化を提供します。最も広く展開されているプロトコル (SOAP、ヘシアン、バーラップ、RMI など) をサポートしています。Java 以外のコードから呼び出している場合、Hessianは他の多くの言語をサポートしており、SOAP よりも効率的で、CORBA よりも簡単であることが知られています。

于 2008-12-15T16:33:08.780 に答える
0

ライセンスに問題がない限り、 CORBAの代わりにICEがあります(GPLですが、商用ライセンスを購入することもできます)。

CORBAのほとんどすべての利点がありますが、ベンダーであるZeroCは、多くの異なる言語のバインディングを提供します。CORBAベンダーは、1つまたは2つの言語バインディングしか提供しない傾向があり、その後、互換性の問題を見つけ始めます。

ドキュメントも優れています。拾うのが特に簡単だとは言わなかったでしょうが、おそらくチョルバよりも簡単でした。

そうでなければ、私が言及されていないと思う別のオプションは、Ciscoによって開発された新しいミドルウェア/ RPCフレームワークであり、現在はEtchと呼ばれるApacheに寄付されています。それはまだかなり新しいです、そしてドキュメントはまばらです。

于 2009-01-27T19:54:29.757 に答える
0

あなたが望むのは Java Native Interface (JNI) ですが、それには困難があるかもしれません。これほど簡単に実装できる同等のテクノロジは他にありません。

前の回答のコメントで述べたように、JNI は Java からネイティブ コードを呼び出すために最適化されていますが、少し手を加えるだけでその逆にも使用できます。ネイティブ コードでは、JNI エントリ ポイント (SetMapPointer() など) を実装する必要があります。次に、Map が構築されたら、Java コードからその関数を呼び出します。SetMapPointer() の実装では、Java オブジェクト ポインターをアクセス可能な場所に保存する必要があります。その後、ネイティブ コードは、必要に応じてその上で Java メソッドを呼び出すことができます。

これが正しい順序で行われることを確認する必要があります (つまり、ネイティブ コードは、ビルドされてネイティブ コードに渡される前に Map にアクセスしようとしません) が、特に難しい問題ではありません。

于 2008-12-15T16:38:03.573 に答える
0

他のプロセスが同じマシン上にあり、OS が (Windows ではなく) POSIX 準拠であるかどうかを検討する別の方法は、名前付きパイプです。

Java アプリケーションがパイプから読み取り、着信操作を解析し、オブジェクトに対してそれらを実行している間に、外部プロセスは操作を文字列またはその他の合意されたバイト エンコーディングとして名前付きパイプに書き込みます。

これは、名前付きパイプにアタッチされた FileInputStream から読み取る SocketInputStream の代わりに、ソケット接続に使用するのと同じ戦略です。

于 2008-12-15T21:32:42.997 に答える
0

JNI (Java Native Interface) を使用すると、C または C++ から Java コードにアクセスできます。

于 2008-12-15T16:18:44.563 に答える
0

いくつかの Java メソッドを呼び出していくつかの操作を実行したり、いくつかの条件をチェックしたりする Inno Setup スクリプト (Java プログラムのインストール) があります。
私 (実際には私の前任者) は、呼び出しごとに java.exe をインスタンス化するだけです。私の場合は重要ではありませんが、これは明らかにコストがかかります (そして、Windows キャッシュが作動すると思います)。

別の方法として、Java プログラムがサーバーとして機能する、言語間通信/メッセージングを使用する方法があります。言語にとらわれない Corba が思い浮かびます。でもちょっと重いかな。ソケットを使用できます。RPC も流行語ですが、私はこの分野での経験があまりありません。

于 2008-12-15T16:23:48.593 に答える