77

次のような状況があります。

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

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

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

私が望むものを達成するためのより良い代替手段は何ですか?

4

7 に答える 7

89

IPCの複数のオプション:

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

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

RMI

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

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

  • 通常、RMI またはネットワーク通信上に構築されますが、複雑な会話とワークフローをサポートします
  • シンプルなものには重すぎるかもしれません
  • ActiveMQJBoss Messagingなどのフレームワーク

Java 管理拡張 (JMX)

  • JVM の管理と監視を目的としていますが、あるプロセスが別のプロセスでデータをクエリしたり、複雑すぎない場合はアクションのリクエストを送信したりしたい場合は、必要なものを実装するのに役立ちます。
  • RMI でも動作します (他の可能なプロトコルの中でも)
  • 最初は頭を包むのは簡単ではありませんが、実際にはかなり簡単に使用できます

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

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

シグナル

  • 他のプロジェクトに信号を送信するだけです
  • ただし、かなり制限されており、翻訳レイヤーを実装する必要があります (実行可能ですが、深刻なことよりおもちゃにするのはかなりクレイジーなアイデアです.

詳細がなくても、ベアボーン ネットワーク ベースの IPC アプローチが最適に思えます。

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

そうは言っても、あなたの例に基づいて(単に他のプロセスにアクションを実行するように要求するだけです)、JMXでも十分です。

于 2012-06-08T02:52:32.910 に答える
23

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

于 2015-05-17T20:59:16.947 に答える
7

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

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

于 2012-06-08T02:45:49.620 に答える
3

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

于 2012-06-08T05:02:07.527 に答える
2

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

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

両方が同じマシン上にある場合、オーバーヘッドと待ち時間は最小限です (通常、アクションごとに約 100ns を超える TCP 往復のみ)。

于 2015-04-30T09:30:39.333 に答える
1

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

于 2012-06-08T02:42:11.407 に答える