2017-12-18 9 views
1

私はJavaアプリケーション 'X'を持っています。 Windows環境では、特定の時点でアプリケーションのインスタンスが複数存在する可能性があります。 実行中のアプリケーションのインスタンス数にかかわらず、アプリケーション 'X'に共通のコードを順番に実行したいです。それは可能なことであり、実現できるのでしょうか?どんな提案も役に立ちます。同じJavaアプリケーションの2つのインスタンスから順番に実行

例:Executorという名前のクラスがあります。ここでメソッド​​が呼び出されます。任意の時点でアプリケーションが2つ以上存在する場合、どのようにして​​というメソッドを別のインスタンスから順番に実行できますか? 2つのインスタンスからアクセスできるロックのようなものがあり、ロックが現在アクティブかどうかを確認しますか?どんな助け?

+0

'execute()'メソッドを使用して1つの中央スタンドアロンアプリケーションを実行し、 TCPまたは任意のプロトコルを使用する他のアプリケーションから。この 'execute()'は同期する必要があります – janith1024

+0

おそらく、C++の中央COMサーバーのようなものを試してみましょう。 Javaアプリケーションは、COMサーバからのフラグをチェックして、そのサーバが待機するようにします(あらかじめ定義された時間と再試行)。そうでない場合はCOMをアクティブに設定して実行します。 2つのインスタンスX1とX2は同じ時点でフラグを設定しようとしますか?どのようにして衝突を避けることができますか? – User

答えて

0

私の知る限り、これを簡単に行うことはできません。プロセス間でTCPコールを実装することもできますが、私はそれをアドバイスしません。

実行を担当する外部プロセスを作成し、executorプロセスが消費するメッセージをJMSキューに送信することによって実行するすべてのタスクを要求することをお勧めします。

...複数のプロセスを同時に実行する必要はありませんが、必要なのは、複数のスレッドが同じ時間に処理を行い、スレッドを1つしか持たないアプリケーションだけです。 Executor。そうすれば、​​メソッド(またはExecutor全体)を同期させるだけで十分です。

1

あなたが探しているのは、分散ロック(つまり、多くのプロセスから見えて制御可能なロック)です。これを念頭に置いて開発されたサードパーティのライブラリがかなりありますが、そのうちのいくつかについてはこのページで説明しています。

Distributed Lock Service

synchornizationメカニズムとして基本となるシステム上のファイルを使用して、この記事では、いくつかの他の提案もあります。

Cross process synchronization in Java

0

Java仮想マシンは別々になりますので、あなたは、エグゼキューまたはそのようなものでこれを達成することはできません。

複数の独立したインスタンス間で実際に同期する必要がある場合は、内部ポートを専用にしてアプリケーション内に単純な内部サーバーを実装する方法があります。広範なコミュニケーションが必要な場合は、ServerSocketまたはRMIをご覧ください。最初のインスタンスは、専用アプリケーションポートにバインドされ、マスターノードになります。後のすべてのインスタンスはアプリケーションポートを取得しますが、それを使用して、必要なアクティビティについて報告するHTTP(またはTCP/IPだけ)呼び出しをマスターノードに送信することができます。

何らかのアクションを順番に実行するだけでよいので、スレーブノードは、自分自身を実行するのではなく、マスターに要求することがあります。

このアプローチの潜在的な問題は、ユーザーがマスターノードをシャットダウンした場合、別の実行ノードがその代わりになる方法を実装するのが複雑なことです。 1つのノードのみがいつでもアクティブである(ユーザーからの入力を受け取る)場合、マスターノードが応答していないことを検出してポートが占有されていないことを検出した後、マスターノードの役割を果たす可能性があります。

0

分散キューは、このタイプのロードバランシングに使用できます。 1つ以上の「要求メッセージ」をキューに入れ、次に使用可能なコンシューマアプリケーションがそれを取り出して処理します。そのような要求メッセージのそれぞれは、処理するタスクを記述することができます。

このタイプのキューは、JMSキューとして実装できます(たとえば、ActiveMQ http://activemq.apache.org/を使用)。Windowsでは、MSMQ:https://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspxもあります。 パフォーマンスが問題でC/C++開発者がいる場合は、「共有メモリキュー」も面白いかもしれません:shmemq API

関連する問題