[
https://issues.apache.org/jira/browse/CAMEL-26431?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Work on CAMEL-26431 started by shashank.
----------------------------------------
> camel-core - ThrottlingExceptionRoutePolicy: throttledExceptions also match a
> suppressed exception (such as one thrown in a doFinally)
> --------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-26431
> URL: https://issues.apache.org/jira/browse/CAMEL-26431
> Project: Camel
> Issue Type: Bug
> Components: camel-core
> Reporter: shashank
> Assignee: shashank
> Priority: Minor
>
> Follow-up of CAMEL-26328 (apache/camel#28751), asked for in its review.
> CAMEL-26328 changes the failover load balancer to match its list of
> exceptions against the exception and its causes only, as {{onException}}
> ({{DefaultExceptionPolicyStrategy}}) and {{doCatch}} ({{CatchProcessor}}) do,
> with {{ObjectHelper.createExceptionIterable}}.
> {{ThrottlingExceptionRoutePolicy.hasFailed}} still checks its
> {{throttledExceptions}} with the same loop the load balancer had:
> {code:java}
> for (Class<?> exception : throttledExceptions) {
> // will look in exception hierarchy
> if (exchange.getException(exception) != null) {
> {code}
> {{Exchange.getException(Class)}} goes through
> {{ObjectHelper.getException(Class, Throwable)}}, which looks at the
> suppressed exceptions first (CAMEL-6406, a general API change) and then at
> the causes. So a failure counts towards opening the circuit when its
> exception is not listed but one of its suppressed exceptions is. Since
> CAMEL-25114 (4.23.0) that happens whenever a {{doFinally}} block throws a
> listed exception while the {{doTry}} block failed with another one; it also
> happens when an {{onException}} block fails while handling a listed exception
> ({{FatalFallbackErrorHandler}}), when the {{onWhen}} of a {{doCatch}} throws,
> after a redelivery that failed with a different exception, and with a
> processor that adds a suppressed exception itself (try-with-resources).
> Example: {{throttledExceptions=java.io.IOException}}, the route fails with an
> {{IllegalStateException}} from the {{doTry}} block and its {{doFinally}}
> cleanup throws an {{IOException}}: the policy counts the failure, while an
> {{onException(IOException.class)}} in the same route does not match it.
> *Proposal*
> * Match {{throttledExceptions}} against the exception and its causes only,
> with {{ObjectHelper.createExceptionIterable}}, so the policy, the failover
> load balancer, {{onException}} and {{doCatch}} agree.
> * Upgrade guide entry (a route that relied on the suppressed match adds the
> type of the exception the route fails with), and tests for the {{doFinally}}
> case with controls (a listed exception thrown directly and as a cause still
> count).
> _Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)