私はこれをしたい:
ActiveMQ はクライアントにメッセージを送信します。
クライアントは、メッセージを処理した後、確認を ActiveMQ に送信します。
クライアントがダウンしているか、メッセージを確認していない場合、このメッセージはキューに残ります。他のすべてのメッセージは配信されません。
サーバーはメッセージを 1 つずつ送信し、クライアントはメッセージを 1 つずつ処理します。最初のメッセージが確認されない限り、次のメッセージは配信されません。
これを行う方法はありますか?
私はこれをしたい:
ActiveMQ はクライアントにメッセージを送信します。
クライアントは、メッセージを処理した後、確認を ActiveMQ に送信します。
クライアントがダウンしているか、メッセージを確認していない場合、このメッセージはキューに残ります。他のすべてのメッセージは配信されません。
サーバーはメッセージを 1 つずつ送信し、クライアントはメッセージを 1 つずつ処理します。最初のメッセージが確認されない限り、次のメッセージは配信されません。
これを行う方法はありますか?
失敗の欠点に関しては、これが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を使用して必要に応じてスロットルを構成することをお勧めします。
あなたが探しているのは、Client Ack または Individual AckのAck モードと組み合わされた低いまたはゼロのプリフェッチ制限の組み合わせです。プリフェッチがゼロの場合、クライアントは基本的にプル ベースのコンシューマーになり、ack を client に設定すると、クライアントがディスパッチされたメッセージを切断して確認できなかった場合、ブローカーはメッセージを再配信します。
以下を試してください...