1

簡略化:
activemq にキューがあります。特定のメッセージがキューから読み取られると、そのプロセスが受信メッセージの処理を終了するまでキューをロックしたいと考えています。

詳細な説明:
多数のユーザーがいるシステムを使用しています。ユーザーがシステムで自分の状態 (プロファイル、ロール、アクセス、資産の所有権など) を変更するたびに、それらの変更でサードパーティ サーバーも更新する必要があります。そのサードパーティは私たちとは別のものであり、彼らが私に公開する API により、一度に 1 人のユーザーのみを更新でき、約 1 秒かかります。
ActiveMQ を使用して、メインの更新プロセスをサード パーティ システムの更新から切り離しています。

一晩に一度、何千ものユーザーの変更を含むフィード ファイルを受け取ります。これは重要なタスクであり、サード パーティの更新はそれほど時間に敏感ではないため、サード パーティの更新では同じテーブルから読み取る必要がある場合があるため、メイン プロセスは一括更新であるため、キューをロックする必要があります。つまり、メイン プロセスで変更した各ユーザーのメッセージを ActiveMQ に取得させたいのですが、メイン プロセスが完了するまで ActiveMQ にこれらのメッセージを保持させたいのです。

そうするための ActiveMQ の組み込みメカニズムはありますか?

4

1 に答える 1

0

通常、コンシューマーごとに一度にメッセージを読み取ります。

通常、次のようなリスナーがあります。

void onMessage( Message message ) {

     // .. 
     updateExternalAPI(); // Sync. call to external API

 }

したがって、onMessageメソッドが終了すると、メッセージがコミットされ、そのコンシューマーは次のメッセージに進みます。そのため、一度に 1 つのメッセージのみが処理されます (コンシューマーが 1 つしかない場合)。

サーバー アプリケーションのノードが 1 つしかない場合、これは簡単です。1 つのコンシューマーのみを使用するように構成するだけです。異なるフレームワーク/クライアント ライブラリでは少し異なります。

これができない、または複数のノードがある場合、ActiveMQ が解決策を提供します。クライアントのキューに追加?consumer.exclusive=trueして、ActiveMQ にメッセージをディスパッチする単一のコンシューマーを強制的に選択させます。

UPDATE.USER.INFO?consumer.exclusive=true

于 2016-01-21T19:59:14.910 に答える