Kontrola ponawiania wielbłądów z wieloma wyjątkami
Przedmowa: Jestem całkiem nowy w Camel, a po strawieniu Camela w akcji najlepiej jak to możliwe, dostosowuję go do projektu, nad którym pracuję. W tym projekcie mamy do czynienia z dość złożoną obsługą błędów i chcę się upewnić, że uda mi się to powtórzyć, gdy zmienimy nasz kod.
W naszym projekcie (jak większość) istnieje zestaw wyjątków, które chcemy ponowić i zestaw, którego nie mamy - ale konkretniej istnieje zestaw, który chcemy ponowić bardziej niż inne (nie wszystkie możliwe do odzyskania błędy mogą być traktowane to samo). W tym przypadku próbowałem zdefiniowaćonException
zablokuj, aby zmienić politykę ponownego dostarczania. Wydaje się jednak, że Exchange utrzymuje licznik (Exchange.REDELIVERY_COUNTER
) i że ta liczba nie jest zależna od tego, który wyjątek został zgłoszony. Czy istnieje sposób, aby ta liczba była specyficzna dla danego wyjątku?
Na przykład - mam dwa wyjątkiFooException
iBarException
. W mojej trasie (lub w całym kontekście) chcę ponowić próbę FooExceptions 10 razy, aleBarException
s powinny ponawiać próbę tylko 2 razy. Kontekst będzie więc zawierał:
<onException>
<exception>my.exception.FooException</exception>
<redeliveryPolicy maximumRedeliveries="10" redeliveryDelay="2000"
</onException>
<onException>
<exception>my.exception.BarException</exception>
<redeliveryPolicy maximumRedeliveries="2" redeliveryDelay="5000"
</onException>
Teraz troska - jeśli moja aplikacja rzuciFooException
i ponawia próby 4 razy (za każdym razem rzucającFooException
), a następnie w piątej próbie rzuca aBarException
, wydaje się, że sposób, w jaki to działa, będzie miałREDELIVERY_COUNTER
5, a kiedy zresetuję zasadę, aby próbować tylko dwa razy, to logicznie dochodzi do wniosku, że nie należy ponawiać próby trasy i wyrzuca wyjątek. Jednak w mojej aplikacjiBarExceptions
należy ponowić dwukrotnie, niezależnie od liczbyFooExceptions
rzucić. Podobnie, jeśli naprzemiennie rzuca wyjątki Foo i Bar, chciałbym, aby zwiększał tylko licznik dla danego wyjątku.
Sam koniec Camel in Action promuje za pomocąretryWhile
- czy to jedyny sposób, aby zdobyć kontrolę, której szukam? Czy muszę utworzyć fasolę stanową, która jest świadoma liczby na wyjątek? A może przeoczyłem coś prostego? Chcę się upewnić, że gdy zbliżam się do tego refaktora, nie zaczynamy nas na brzydkiej ścieżce.
Korzystanie z wielbłąda 2.10.1