1

私はこれをしたい:

  1. ActiveMQ はクライアントにメッセージを送信します。

  2. クライアントは、メッセージを処理した後、確認を ActiveMQ に送信します。

  3. クライアントがダウンしているか、メッセージを確認していない場合、このメッセージはキューに残ります。他のすべてのメッセージは配信されません。

  4. サーバーはメッセージを 1 つずつ送信し、クライアントはメッセージを 1 つずつ処理します。最初のメッセージが確認されない限り、次のメッセージは配信されません。

これを行う方法はありますか?

4

3 に答える 3

0

失敗の欠点に関しては、これがactiveMQの動作方法です。

「失敗/不正な確認」がビジネスロジック層で発生する場合は、トランザクションを使用する必要があります

警告有効なコードではありません(プラダイム)

// at your Listener
public void onMessage(Message message)
{
    if (isValid(message))
    {
        connection.ack();
        commit();
        return;
    }
    rollback();
}

メッセージのスロットリングと永続性に関しては、次の宛先ポリシーの構成が役立ちます。

    <destinationPolicy>
        <policyMap>
          <policyEntries>
            <policyEntry topic=">" producerFlowControl="true" memoryLimit="10mb">
              <pendingSubscriberPolicy>
                <vmCursor />
              </pendingSubscriberPolicy>
            </policyEntry>
            <policyEntry queue=">" producerFlowControl="true" memoryLimit="10mb">
              <pendingQueuePolicy>
                <vmQueueCursor/>
              </pendingQueuePolicy>
            </policyEntry>
          </policyEntries>
        </policyMap>
    </destinationPolicy>

IMHO私もこの種の永続性のためにMySQLを使用します

    <persistenceAdapter>
        <jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#mysql-ds"/>
    </persistenceAdapter>

また、Camelを使用して必要に応じてスロットルを構成することをお勧めします。

于 2012-11-05T16:46:48.400 に答える
0

あなたが探しているのは、Client Ack または Individual AckのAck モードと組み合わされた低いまたはゼロのプリフェッチ制限の組み合わせです。プリフェッチがゼロの場合、クライアントは基本的にプル ベースのコンシューマーになり、ack を client に設定すると、クライアントがディスパッチされたメッセージを切断して確認できなかった場合、ブローカーはメッセージを再配信します。

于 2012-11-05T11:21:28.460 に答える
0

以下を試してください...

  • キューのプリフェッチを 0 に設定
  • TRANSACTED 確認を使用する
  • シングル スレッド コンシューマー (concurrentConsumers=1/maxConcurrentConsumers=1 など)
  • DispatchAsync を設定 = false
于 2012-11-06T05:33:03.353 に答える