web-dev-qa-db-ja.com

2つのJVMが互いに通信する方法

次の状況があります。

ローカルマシンで実行されている2つのJVMプロセス(2つのスレッドではなく、別々に実行されている2つのJavaプロセス)があります。それらをProcessAProcessBと呼びましょう。

互いに通信(データ交換)したい(たとえば、ProcessAProcessBにメッセージを送信して何かをする)。

今、私は一時ファイルを書き込むことでこの問題を回避し、これらのプロセスは定期的にこのファイルをスキャンしてメッセージを取得します。この解決策はあまり良くないと思います。

私が望むものを達成するためのより良い選択肢は何ですか?

62
tnk_peka

[〜#〜] ipc [〜#〜] の複数のオプション:

ソケットベース(ベアボーン)ネットワーキング

  • 必ずしもハードではない 、しかし:
    • それほど冗長ではないかもしれませんが、
    • より多くのコードを記述すると、バグの表面がより多く提供される可能性があります。
  • Netty のような既存のフレームワークに依存できます。

[〜#〜] rmi [〜#〜]

  • 技術的には、それはネットワーク通信でもありますが、透過的です。

本格的なメッセージパッシングアーキテクチャ

  • 通常、RMIまたはネットワーク通信のいずれかに基づいて構築されますが、複雑な会話とワークフローをサポートします
  • 単純なものには重すぎるかもしれません
  • ActiveMQ または JBoss Messaging のようなフレームワーク

Java Management Extensions(JMX)

  • JVMの管理と監視 をより意味しますが、1つのプロセスがデータを別のプロセスに照会したい場合や、そうでない場合はアクションのリクエストを送信したい場合に必要なものを実装するのに役立ちます複雑すぎる
  • また、RMI(他の可能なプロトコル)で動作します
  • 最初は頭を包むのはそれほど簡単ではありませんが、 実際にはかなり簡単です

ファイル共有/ファイルロック

  • それが今あなたがしていることです
  • それは実行可能ですが、処理する多くの問題が付属しています

信号

  • 他のプロジェクトに信号を送信するだけです
  • ただし、それはかなり制限されており、変換レイヤーを実装する必要があります(それは(is実行可能ですが、深刻なものよりもやるのはかなりおかしいアイデアです)。

詳細がなければ、ベアボーンネットワークベースのIPCアプローチが最善のようです。

  • 最も拡張性の高い(新しい機能とワークフローを追加するという点で
  • 最も軽量(アプリのメモリフットプリントに関して)
  • 最もシンプル(デザインの観点から)
  • 最も教育的(IPCの実装方法の学習に関して)。 (コメントで「ソケットは難しい」と述べたように、実際にはそうではなく、取り組むべきものです)

そうは言っても、あなたの例(単に他のプロセスにアクションを要求する)に基づいて、JMXはあなたにとっても十分に良いかもしれません。

79
haylem

Mappedbus( http://github.com/caplogic/mappedbus )というgithubにライブラリを追加しました。これにより、2つ(またはそれ以上)を有効にするJava processes/JVMはメッセージを交換して通信します。ライブラリはメモリマップファイルを使用し、フェッチアンドアドと揮発性の読み取り/書き込みを使用して異なるリーダーとライターを同期しますこのライブラリを使用して2つのプロセス間のスループットを40に測定しました単一のメッセージを読み書きするための25 nsの平均レイテンシで100万メッセージ/秒。

18
MikaelJ

探しているのはinter-process communication。 Javaは、単純なIPC Java RMI API の形式のフレームワークを提供します。プロセス間通信には他にもいくつかのメカニズムがあります。パイプ、ソケット、メッセージキューとして(これらはすべて概念であり、明らかに、これらを実装するフレームワークがあります)。

あなたの場合はJava RMIまたは単純なカスタムソケット実装で十分です。

6
Strelok

Javaオブジェクトを前後に送信するためのDataInput(Output)Streamを備えたソケット。これはディスクファイルを使用するよりも簡単で、Nettyよりもはるかに簡単です。

3

私はjGroupを使用してプロセス間でローカルクラスターを形成する傾向があります。同じマシン上、同じJVM内、または異なるサーバー間でも、ノード(プロセス)に対して機能します。

基本を理解すれば簡単に操作でき、同じJVMで2つ以上のプロセスを実際に実行するオプションがあるため、それらのプロセスを簡単にテストできます。

両方が同じマシン上にある場合、オーバーヘッドと遅延は最小限です(通常、アクションごとに約> 100nsのTCPラウンドトリップのみ)。

2
Martin Kersten

ソケットの方が良い選択かもしれません。

1
Marcus

2004年に戻って、ソケットでジョブを実行するコードを実装します。それまでは、ソケットアプローチがファイアウォールをトリガーし、クライアントが心配するため、より良いソリューションを何度も探しています。これまで、これ以上の解決策はありません。クライアントはデータをシリアル化し、送信し、サーバーは受信してシリアル化を解除する必要があります。容易いものだ。

0
Chameleon