Claus Ibsen created CAMEL-24981:
-----------------------------------
Summary: camel-core - Error handler keeps the onException of an
earlier redelivery attempt when the exception type changes
Key: CAMEL-24981
URL: https://issues.apache.org/jira/browse/CAMEL-24981
Project: Camel
Issue Type: Bug
Components: camel-core
Reporter: Claus Ibsen
If the exception changes type between redelivery attempts, the error handler
keeps using the onException settings chosen for the first exception.
h3. Reproducer
{code:java}
errorHandler(deadLetterChannel("mock:dead"));
onException(IOException.class).maximumRedeliveries(1).handled(true).to("mock:io");
from("direct:b").process(e -> {
if (attempt.getAndIncrement() == 0) {
throw new IOException("first");
}
throw new IllegalArgumentException("second");
});
{code}
The first attempt fails with IOException and is redelivered. The redelivery
fails with IllegalArgumentException, which no onException matches, so it should
go to the dead letter channel. Instead it is routed to mock:io and marked
handled by the IOException onException.
h3. Cause
RedeliveryErrorHandler.RedeliveryTask.handleException only overwrites the
failure processor, handled/continued/retryWhile predicates,
useOriginalMessage/Body, onRedelivery/onExceptionOccurred processors and
redelivery policy when an exception policy matches. It never resets them to the
error handler defaults first, so values from an earlier attempt's policy carry
over. The redelivery policy is also derived from the previous attempt's derived
policy instead of the error handler's own policy. This behaviour dates from
2009, and nothing in history or JIRA says it was intended.
h3. Fix
Reset the per-attempt state to the error handler defaults before applying the
policy that matches the current exception.
_Claude Code on behalf of Claus Ibsen_
--
This message was sent by Atlassian Jira
(v8.20.10#820010)