ActiveMQ にキューがあり、Spring 統合を使用してアプリケーションにメッセージを取り出したいと考えています。アプリケーションを 2 回デプロイしました (そのうちの 1 つが失敗した場合)。各メッセージは、アプリケーションの 1 つだけで処理する必要があります。さらに、メッセージ処理中に致命的なアプリケーション障害が発生した場合に備えて、jms tx マネージャーが必要です。そのため、私のチャネルアダプターは次のようになります。
<int-jms:message-driven-channel-adapter
channel="myChannel"
connection-factory="jmsConnectionFactory"
pub-sub-domain="false"
destination-name="MY_QUEUE"
transaction-manager="jmsTxManager" />
直接チャネルの場合、これはすべて正常に機能myChannel
しますが、多くのメッセージを一度に処理できるように、タスク エグゼキュータを使用したいと考えています。
致命的なアプリケーション障害に対応するために、私はランデブー チャネルが適していると考えました (タスク エグゼキュータでスレッドが解放されると、チャネル アダプタはアクティブな mq に移動して別のメッセージを取得すると信じていました)。 t は、チャネルのメモリに保持されている任意のメッセージです。これは機能していないようで、次のコードがスローされTaskRejectException
ます。
<int:channel id="myChannel">
<int:rendezvous-queue />
</int:channel>
<task:executor id="taskExecutor" pool-size="2" queue-capacity="0" />
<int:router input-channel="myChannel" expression="payload.getType() + 'Channel'">
<int:poller fixed-rate="1000" task-executor="taskExecutor" />
</int:router>
ルーターの後に配置され、同期的に処理するサービス アクティベーターは、処理に 10 秒かかるため、t=0s で離れて 2 つのメッセージ (スレッド プールのサイズ) を取得し、それらを処理し、スレッドを解放することを期待します。 t=10 秒でスレッド プールを解放し、アクティブな mq からのメッセージを再度要求します。ただし、t=0s で 2 つ以上のメッセージが取得されているようです。
誰が私が何をすべきかについてアドバイスできますか?