0

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 つ以上のメッセージが取得されているようです。

誰が私が何をすべきかについてアドバイスできますか?

4

1 に答える 1

4

トランザクションが機能するためには、直接チャネルを使用する必要があります。

message-driven-channel-adapter(concurrent-consumersおよび)の同時実行属性を使用して、同時スレッドの数を制御できますmax-concurrent-consumers

于 2013-08-08T17:42:33.757 に答える