我有一個ErrorHandler
(DefaultErrorHandler
),我已經提供了onRedelivery
ref。默認情況下,ErrorHandler
重試次數不限。但是,如果存在某種條件(目前由onRedelivery
ref確定),我想退出重新遞送循環並執行不同的路線。從onRedelivery觸發新的onException路由
我最初的想法是讓onRedelivery
參考拋出和異常,並有一個適當的onException
指示適當的路線。但是,我發現RedeliveryErrorHandler
捕獲此異常並保持循環。
我也發現,我可以將Exchange.REDELIVERY_EXHAUSTED
設置爲true,它將退出重新遞送循環,但不會將我指向我的恢復路線。
有什麼建議嗎?
Edit
所以我發現,如果我在RouteBuilder
加上原有的異常類型的異常類型的onException
中,我有我的ErrorHandler
,如果我設置Exchange.REDELIVERY_EXHAUSTED
爲真,原始異常將被拋到RouteBuilder
範圍並被onException
抓住。但是,我真的更喜歡拋出並捕獲新的異常類型,以便對這種情況進行明確的處理。
Answer
因此,使用retryWhile
的Peter's
建議是巨大的,因爲它可以讓我以編程方式確定何時停止重試。它太。它只有一半的想法。第二部分是將發生故障的交換機發送到新的/不同的路由以進行錯誤處理。這是通過使用DeadLetterChannel
而不是DefaultErrorHandler
來完成的。
你好彼得,你不應該存儲狀態信息(計數)到比如說myPredicate實例。當需要處理多個異常時,保持Predicate實例無狀態可以避免一些有線錯誤。 –
@WillemJiang感謝您的提示。我相應地更新了我的示例。 –
+1這看起來完全正確。在打分爲正確答案之前,我要測試它是否有效。謝謝! –