2009-04-03 12 views
5

Windows上のJavaサービスに対して複数の異なるサーバー間で複数のスレッドの処理を同期させる必要があるという問題があります。Java:複数のサーバー間でスレッドを同期する

このアプリケーションでは、同じJMSキューから複数のコンシューマスレッドpullingsメッセージがあります。メッセージは3つまたは4つのグループに分かれています。各グループのメッセージが完全にシリアルで処理されるようにする必要があります。スレッド1がメッセージをオフにしてから、スレッド2がそのグループから次のメッセージをプルするかどうかを確認するために、何らかの同期メカニズムが必要です。スレッド2はスレッド1の処理が完了する前に処理を完了します。

スレッドの分散同期メカニズムに関する提案はありますか?どんなタイプのソリューションも良いでしょう(JMSソリューション、分散キャッシングなど)

注:使用しているJMSプロバイダはActiveMQです。

答えて

7

ActiveMQはmessage groupsをサポートしています。これはまさに文字通り正確に必要なものです。

+0

を分散。新しいグループを継続的に作成している場合、メッセージグループで何が起こるかを知っていますか?内部ハッシュは継続的に成長するでしょうか?グループを「削除」または「期限切れにする」方法があるので、グループはメモリに永久に座るだけではありませんか?答えはThx、btw。 –

+0

メッセージグループを閉じることができます(リンク先のページで詳しく説明しています)。私は、新しいグループを作成する際のオーバーヘッドについては分かりませんが、ソースから直接どのように行われているかを確認するのはおそらくでしょう。 – andri

1

メッセージヘッダーにグループIDのようなものはありますか?そうであれば、消費者はグループを順に処理するためにSelectorを作成することができます。

特定のコンシューマにグループを割り当てることは、グループ識別子をハッシュすることによって行うことができます。また、Paxosや仮想同期のようなコンセンサスプロトコルを使用して互いに積極的に調整することもできます(メッセージは別のキューで送信されます) 。

+0

各グループには、それらをすべてグループ化するために使用できる「グループID」フィールドがあります。しかし、このグループIDは外部から来ているため、消費者は最初のメッセージを取得するまでIDを知りません。 –

+0

それがあなたに有用な情報を与えるかどうかは不明です。私は中間的なJMSユーザーのようなので、まだセレクタを使用していません。 –

7

Hazelcast分散ロックを使用することを検討してください。スーパーライト、簡単でオープンソース。

java.util.concurrent.locks.Lock lock = Hazelcast.getLock ("mymonitor"); 
lock.lock(); 
try { 
// do your stuff 
}finally { 
    lock.unlock(); 
} 

よろしく、

-talip

Hazelcast - オープンソースは、私はそれらについて簡単に見てきたキュー、地図、セット、リスト、ロック

関連する問題