キューを介して送信されたすべてのメッセージのコピーを作成し、必要に応じて、ユーザーが以前に送信されたメッセージのリストを参照し、ボタンをクリックするだけで何度も再生できるようにする簡単な方法はありますか?
メッセージをキューに送信し、プログラム Y がそれを読み込むプログラム X があります。プログラム X に戻って再生成することなく、以前に送信されたメッセージを再生できるようにしたいと考えています。
メッセージやキューが多すぎない場合は、簡単に開始する方法があります。
まず、「コピー キュー」へのメッセージのコピーを設定できます。これは、この戦略ではキューごとに 1 回実行する必要があります。このようにactivemq.xml
<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<compositeQueue name="INVOICE.OUT">
<forwardTo>
<queue physicalName="INVOICE.IN" />
<queue physicalName="INVOICE.COPY" />
</forwardTo>
</compositeQueue>
</virtualDestinations>
</virtualDestinationInterceptor>
</destinationInterceptors>
次に、ツールを使用して COPY キューのメッセージを参照し、必要に応じてそれらを OUT キューに再送信します。私は、ヘルメスの JMSツールが好きです。
もっと派手なものが必要な場合は、mirrored queuesを読むことができます。
すべてのメッセージを簡単にコピーする簡単な方法がもう 1 つあります。
activemq にバンドルされている apache-camel を使用します。内部のこのcamel.xml
構成は、FOO で始まるキューへのすべてのメッセージの自動コピーを達成します。
<route>
<from uri="activemq:FOO.>"/>
<setHeader headerName="CamelJMSDestination">
<simple>COPY.${header.JMSDestination}</simple>
</setHeader>
<to uri="activemq:dummy"/>
</route>
ここで非常に重要な点は、すべてのメッセージを保存すると、時間の経過とともにサーバーがいっぱいになることです。ActiveMQ メモリ管理について読むか、特定の期間だけメッセージのコピーを保持することをお勧めします。これは、送信システムが実際にメッセージの有効期限を設定できるという意味で自動化できるため、メッセージは数日/数週間/数か月後に自動的に削除されます。
残念ながら、簡単な方法はありません。そのような動作は、待ち行列システムの考え方に違反するからです。ただし、試すことができることがいくつかあります。
QueueBrowser
てそれらにアクセスできます。ただし、最終的にはタイムアウトしますsend()
またはpreDispatch()
メソッドでメッセージをインターセプトします。そこにcontentのコピーを保存します。また、リプレイ リクエストをリッスンし、リクエストに応じて履歴を送信する必要があります (JMS メッセージ ヘッダーの返信先フィールドを利用できます)。ActiveMQ に付属している統計プラグインは、ここから始めるのに適したソースです。ああ、もちろん、サーバーも最終的にメモリ不足になります。