Control de reintentos de camellos con múltiples excepciones.

Prefacio: Soy bastante nuevo en Camel, y después de digerir Camel en acción lo mejor posible, lo estoy adaptando a un proyecto en el que estoy. En este proyecto, tenemos un manejo de errores bastante complejo, y quiero asegurarme de que puedo replicar esto a medida que camelizamos nuestro código.

En nuestro proyecto (como la mayoría) hay un conjunto de Excepciones que queremos volver a intentar y un conjunto que no, pero más específicamente, hay un conjunto que queremos volver a intentar más que otros (no todos los errores recuperables se pueden tratar lo mismo). En este caso, estaba intentando definir unaonException Bloque para cambiar la política de reenvío. Sin embargo, parece que la Bolsa mantiene el recuento (Exchange.REDELIVERY_COUNTER) y que este recuento no depende de qué excepción se lance. ¿Hay alguna manera de hacer que este conteo sea específico para una excepción dada?

Por ejemplo - Tengo dos excepciones.FooException yBarException. En mi ruta (o realmente en todo el contexto), quiero volver a intentar FooExceptions 10 veces, peroBarExceptions sólo debe reintentar 2 veces. Así que el contexto contendrá:

<onException>
     <exception>my.exception.FooException</exception>
     <redeliveryPolicy maximumRedeliveries="10" redeliveryDelay="2000"
</onException>

<onException>
      <exception>my.exception.BarException</exception>
      <redeliveryPolicy maximumRedeliveries="2" redeliveryDelay="5000"
</onException>

Ahora, la preocupación - si mi aplicación arroja unFooException y reintentos 4 veces (cada vez lanzando unFooException) y luego en el quinto intento, lanza unBarExceptionParece que la forma en que funciona esto es que el intercambio tendrá unREDELIVERY_COUNTER de 5, y cuando restablezco la política para que solo lo intente dos veces, (lógicamente) concluye que la ruta no se debe volver a intentar y se desecha la excepción. Sin embargo, en mi aplicaciónBarExceptions debe reintentarse dos veces, independientemente de la cantidadFooExceptions ser arrojado Y de la misma manera, si alterna lanzando excepciones de Foo y Bar, me gustaría que solo incremente el contador para la excepción dada.

El final de Camel in Action promueve el uso de unretryWhile - ¿Es esta la única manera de tomar el tipo de control que estoy buscando? ¿Necesito crear un bean con estado que sea consciente del recuento por excepción? ¿O estoy pasando por alto algo simple? Quiero asegurarme de que cuando me acerque a este refactorista no comencemos un camino feo.

Utilizando Camel 2.10.1

Respuestas a la pregunta(2)

Su respuesta a la pregunta