java 確認 複数のコンシューマを持つJMSキュー




jms キュー 確認 (2)

申し訳ありませんが、正確に何が問題なのか理解できません。 私たちは2.0.0.GAバージョンと2.2.2.Finalでhornetqを使用しました。 いずれの場合も、キューベースのロードバランシングは正常に動作します。 1つのキューに対して複数のコンシューマを定義し、それらのすべてがアクティブな場合、メッセージは自動的にそれらの間で分散されます。 消費者Aへの最初のメッセージ、消費者Bへの2番目のメッセージ、消費者Cへの3番目のメッセージなど。 これは、複数のコンシューマを持つキューが動作する方法です。つまり、負荷分散は自由です。つまり、あるコンシューマをシャットダウンすると、他のコンシューマがメッセージを受け取るのが普通です。

私はHornetQと単一のキューを持つJBoss-6サーバーを持っています。

<queue name="my.queue">  
    <entry name="/queue/test"/>  
</queue>

このキューに接続された別のコンシューマ(異なるマシン上)が、 一度に1つのコンシューマだけがアクティブになります。 このコンシューマをシャットダウンすると、他のコンシューマの1人がすぐにメッセージを処理します。

私のメッセージには時間がかかる処理があるので、複数の消費者が一意のメッセージを同時に処理したい。

このセットアップが問題なく機能していた以前のバージョンのJBossでは、似たようなことを思い出しました。 Jboss-6では、上記の問題を除いて、メッセージングシステムはうまくいきます。 この質問は、hornetqで複数のクライアントコンシューマーが可能ですか? シナリオは私のものと似ていません。

アップデート1 :ある消費者を閉じて(STRG + C)、次の消費者がメッセージを受け取るまで、短いタイムアウト(サーバが失われた消費者を認識するまで)があります。

アップデート2 :コードスニペット

VoidListener ml = new VoidListener();
QueueConnectionFactory qcf = (QueueConnectionFactory)
                             ctx.lookup("ConnectionFactory");
QueueConnection conn = qcf.createQueueConnection();
Queue queue = (Queue) ctx.lookup(queueName);
QueueSession session = conn.createQueueSession(false,
                                               QueueSession.AUTO_ACKNOWLEDGE);

QueueReceiver recv = session.createReceiver(queue,"");
recv.setMessageListener(ml);
conn.start();

そしてMessageListerner:

public class OlVoidListener implements MessageListener
{
  public void onMessage(Message msg)
  {
    counter++;
    logger.debug("Message ("+counter+") received");
    try {Thread.sleep(15*1000);} catch (InterruptedException e) {}
  }
}

キューに複数のコンシューマが存在する場合、メッセージはコンシューマ間で負荷分散されます。

メッセージを消費するのに時間がかかるので、消費者ウィンドウサイズを設定してバッファリングを無効にする必要があります。

hornetQには、ディストリビューションの例、クライアントのバッファリングを無効にする方法、遅い消費者のためのより良いサポートを与える方法があります。 (遅い消費者は、メッセージを処理する時間がある消費者です)

メッセージシステムは、処理を高速化し、ネットワーク待ち時間を回避するために、クライアントバッファへのプリフェッチ/先読みメッセージをプリフェッチする。 高速処理キューと単一のコンシューマがある場合は、これは問題ではありません。

JBoss Messagingは、接続ファクトリで低消費者オプションを提供し、hornetqはコンシューマウィンドウサイズを提供しました。

ほとんどのメッセージシステムは、クライアントプリフェッチを有効または無効にする方法を提供します。





hornetq