次の状況があります。
ローカルマシンで実行されている2つのJVMプロセス(2つのスレッドではなく、別々に実行されている2つのJava
プロセス)があります。それらをProcessA
とProcessB
と呼びましょう。
互いに通信(データ交換)したい(たとえば、ProcessA
がProcessB
にメッセージを送信して何かをする)。
今、私は一時ファイルを書き込むことでこの問題を回避し、これらのプロセスは定期的にこのファイルをスキャンしてメッセージを取得します。この解決策はあまり良くないと思います。
私が望むものを達成するためのより良い選択肢は何ですか?
[〜#〜] ipc [〜#〜] の複数のオプション:
詳細がなければ、ベアボーンネットワークベースのIPCアプローチが最善のようです。
そうは言っても、あなたの例(単に他のプロセスにアクションを要求する)に基づいて、JMXはあなたにとっても十分に良いかもしれません。
Mappedbus( http://github.com/caplogic/mappedbus )というgithubにライブラリを追加しました。これにより、2つ(またはそれ以上)を有効にするJava processes/JVMはメッセージを交換して通信します。ライブラリはメモリマップファイルを使用し、フェッチアンドアドと揮発性の読み取り/書き込みを使用して異なるリーダーとライターを同期しますこのライブラリを使用して2つのプロセス間のスループットを40に測定しました単一のメッセージを読み書きするための25 nsの平均レイテンシで100万メッセージ/秒。
探しているのはinter-process communication
。 Javaは、単純なIPC Java RMI API の形式のフレームワークを提供します。プロセス間通信には他にもいくつかのメカニズムがあります。パイプ、ソケット、メッセージキューとして(これらはすべて概念であり、明らかに、これらを実装するフレームワークがあります)。
あなたの場合はJava RMIまたは単純なカスタムソケット実装で十分です。
Javaオブジェクトを前後に送信するためのDataInput(Output)Streamを備えたソケット。これはディスクファイルを使用するよりも簡単で、Nettyよりもはるかに簡単です。
私はjGroupを使用してプロセス間でローカルクラスターを形成する傾向があります。同じマシン上、同じJVM内、または異なるサーバー間でも、ノード(プロセス)に対して機能します。
基本を理解すれば簡単に操作でき、同じJVMで2つ以上のプロセスを実際に実行するオプションがあるため、それらのプロセスを簡単にテストできます。
両方が同じマシン上にある場合、オーバーヘッドと遅延は最小限です(通常、アクションごとに約> 100nsのTCPラウンドトリップのみ)。
ソケットの方が良い選択かもしれません。
2004年に戻って、ソケットでジョブを実行するコードを実装します。それまでは、ソケットアプローチがファイアウォールをトリガーし、クライアントが心配するため、より良いソリューションを何度も探しています。これまで、これ以上の解決策はありません。クライアントはデータをシリアル化し、送信し、サーバーは受信してシリアル化を解除する必要があります。容易いものだ。