I'm using Camel 2.9.1 in our integration platform. Among other things we
have a fairly general file transfer service that logs all file transfers in
a database. If a  fail transfer has failed, that fact is recorded along
with the exception that was caught. I have now discovered that if the
exchange first fails but then succeeds in a subsequent retry, it is still
recorded as failed.

This is probably because of my erroneous logic. I do this to see if it has
failed:

*Exception cause = theExchange.getProperty(Exchange.EXCEPTION_CAUGHT,
Exception.class);*
*if (theExchange.isFailed() || (cause != null)) {*
*  <Regard the exhange as failed>*

The reason why I can't just use "theExchange.isFailed()" is that it always
returns false for me. I think this is because I use the "moveFailed"
option. I then added a check for an exception. However, once the
EXCEPTION_CAUGHT property is set on an exchange, it will stay there even if
a subsequent retry will succeed. Thus checking for this property is not a
good solution.

The question then is how I can check if the last retry failed or not. I
have noticed three properties on a failed exchange that look like good
candidates to look for:

- CamelFailureEndpoint
- CamelFailureHandled
- CamelErrorHandlerHandled

My instinct says that I should check for the CamelFailureHandled property.
The logic to determine whether an exchange has failed would then be:

*boolean failureHandled =
(boolean)theExchange.getProperty(Exchange.FAILURE_HANDLED, false);*
*if (theExchange.isFailed() || failureHandled) {*
*  <Regard the exhange as failed>*

Is this a correct (future proof) way of determining if an exhange has
failed?

/Bengt

Reply via email to