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, aleBarExceptions 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

questionAnswers(2)

yourAnswerToTheQuestion