0

例外が発生した場合や ActiveMQ が失敗した場合、ActiveMQ fromChannel からのメッセージを消費しているサービス アクティベーターなどのコンシューマーを再起動する必要があります。次の春の統合コンテキストでそれを行う方法は?

 <!-- RECEIVER. message driven adapter -> jmsInChannel -> activator. -->

<si:channel id="fromChannel"/>

<int-jms:message-driven-channel-adapter id="messageDrivenAdapter"
    channel="fromChannel" destination="forward" connection-factory="connectionFactory"
    max-concurrent-consumers="2" auto-startup="true" acknowledge="auto" extract-payload="false" />

<si:service-activator id ="activator" 
    input-channel="fromChannel"
    ref="messageService" 
    method="process"/>

<bean id="messageService" class="com.ucware.ucpo.forward.jms.MessageService"/>

私の最初のアイデアは、再試行アドバイスを使用してサービスに追加することでしたが、これが未処理の例外に対する正しい解決策であるかどうかはわかりません。また、ActiveMQ サーバーがダウンした場合にレシーバーを再起動したいと考えています。

4

2 に答える 2

3

内のリスナー コンテナーはmessage-driven-channel-adapter、ブローカーへの接続が失われると、自動的に再接続を試み続けます。

`acknowledge="transacted"' を設定すると、メッセージは例外でロールバックされ、ブローカーはそれを再送信します。

ステートフルな再試行アドバイスを使用すると、何度か再試行した後にあきらめて他のアクションを実行できます (ただし、それを ActiveMQ 自体に構成して、配信を何度か試行した後にメッセージを DLQ に送信することもできます)。

于 2013-08-08T13:22:42.553 に答える
1

あなたの投稿を読んで、すぐにこのビデオが思い浮かびました。これにより、SI アプリケーション自体を監視および制御する方法についての優れた洞察が得られます。

さらに、SI のApplicationEventドキュメントを参照する必要があります。

すべてをまとめると、JMX を使用して JMS メッセージ アダプターを監視し、問題が発生した場合に ApplicationEvent を送信して停止および再起動できます。例外のキャッチに関しては、実際に処理したい例外によって異なります。コンポーネントによってスローされた例外を受け取る errorChannel を作成し、エラーを受け取った後にこれらのコンポーネントを再起動する新しいサービスを作成します。

SI でSpring Retryの機能を活用するアイデアに従ってください。

于 2013-08-08T13:06:13.833 に答える