序文: 私は Camel にかなり慣れていないので、Camel の動作を可能な限り消化した後、自分が取り組んでいるプロジェクトに適応させています。このプロジェクトでは、かなり複雑なエラー処理がいくつかあります。コードを Camel 化する際に、これを確実に複製できるようにしたいと考えています。
私たちのプロジェクトには(ほとんどの場合)、再試行したい例外のセットとそうでないセットがありますが、より具体的には、他のものよりも再試行したいセットがあります(すべての回復可能なエラーを処理できるわけではありません同じ)。この場合、onException
ブロックを定義して再配信ポリシーを変更しようとしました。ただし、Exchange はカウント ( Exchange.REDELIVERY_COUNTER
) を保持しており、このカウントはスローされた例外に依存していないようです。このカウントを特定の例外に固有にする方法はありますか?
たとえば、私には 2 つの例外がFooException
ありBarException
ます。私のルート (または実際にはコンテキスト全体) では、FooExceptions を 10 回再試行したいのですが、BarException
s は 2 回だけ再試行する必要があります。したがって、コンテキストには次が含まれます。
<onException>
<exception>my.exception.FooException</exception>
<redeliveryPolicy maximumRedeliveries="10" redeliveryDelay="2000"
</onException>
<onException>
<exception>my.exception.BarException</exception>
<redeliveryPolicy maximumRedeliveries="2" redeliveryDelay="5000"
</onException>
さて、懸念事項 - アプリケーションが aFooException
をスローして 4 回再試行し (毎回 a をスローするFooException
)、5 回目の試行で をスローするBarException
と、Exchange の aREDELIVERY_COUNTER
は 5 になるようです。ポリシーを 2 回だけ試行するようにリセットすると、(論理的に) ルートを再試行すべきではないと判断され、例外がスローされます。ただし、私のアプリケーションでは、スローされたBarExceptions
回数に関係なく、2 回再試行する必要があります。FooExceptions
同様に、Foo 例外と Bar 例外を交互にスローする場合は、特定の例外のカウンターのみをインクリメントしたいと思います。
Camel in Action の最後で、retryWhile
私が探している種類のコントロールを取得するには、これが唯一の方法ですか? 例外ごとのカウントを認識するステートフル Bean を作成する必要がありますか? それとも単純なものを見落としていますか?このリファクタリングに取り組む際に、醜い道を歩み始めないようにしたいと思います。
Camel 2.10.1 の使用