0

Spring と RabbitMQ を使用してプロジェクトをセットアップしています。現在、別の非同期プロセスが完了するまで処理できない amqp メッセージをアプリケーションが受信する可能性があります (レガシーで完全に切り離されており、制御できません)。その結果、メッセージの処理をしばらく待たなければならない場合があります。この結果は、トランスフォーマーの例外です。

メッセージが rabbitMQ に NACK で返されると、メッセージはキューの先頭に戻され、すぐに再プルされます。同時リスナーの数と同じ処理不能メッセージを受け取ると、ワークフローがロックアップします。処理可能な有効なメッセージがキューの後ろで待機している場合でも、メッセージが処理可能になるのを待って車輪を回転させます。

メッセージを拒否して amqp し、代わりにキューの末尾に戻す方法はありますか? 私の調査によると、rabbitMQ はかつてこのように機能していましたが、現在はキューの先頭のみを取得しているようです。

私の設定はかなり単純ですが、ここでの継続性のために...

接続ファクトリー: org.springframework.amqp.rabbit.connection.CachingConnectionFactory RabbitMQ 3.1.1

春の統合: 2.2.0

<si:channel id="channel"/>
<si-amqp:inbound-channel-adapter
    queue-names="commit" channel="channel" connection-factory="amqpConnectionFactory"
    acknowledge-mode="AUTO" concurrent-consumers="${listeners}"
    channel-transacted="true"
    transaction-manager="transactionManager"/>

<si:chain input-channel="channel" output-channel="nullChannel">
    <si:transformer ref="transformer"></si:transformer>
    <si:service-activator ref="activator"/>
</si:chain>
4

1 に答える 1

0

RabbitMQ が少し前に変更されたことは正しいです。API には動作を変更するものは何もありません。

もちろん、error-channelインバウンド アダプターに を配置し、その後にトランスフォーマー ( expression="payload.failedMessage") を配置し、その後に適切な交換/ルーティング キーで構成されたアウトバウンド アダプターを配置して、メッセージをキューの後ろに再キューイングすることができます。

エラー フローにロジックを追加して、例外の種類 ( payload.cause) を確認し、必要なアクションを決定することができます。

エラー フロー自体が例外をスローした場合、以前と同様に、元のメッセージが先頭で再キューイングされます。正常に終了すると、メッセージは確認応答されます。

于 2013-10-07T22:53:56.190 に答える