[ 
https://issues.apache.org/jira/browse/CAMEL-26464?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Claus Ibsen resolved CAMEL-26464.
---------------------------------
    Resolution: Fixed

Merged to main via https://github.com/apache/camel/pull/29127 (9a171984d3c0), 
fixed in 4.24.0.

_Claude Code on behalf of davsclaus_

> camel-core - an AsyncProcessor that throws in a block whose steps have no 
> error handler (doTry, onException) hangs the exchange
> -------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-26464
>                 URL: https://issues.apache.org/jira/browse/CAMEL-26464
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>             Fix For: 4.24.0
>
>
> Follow-up of CAMEL-26430, CAMEL-26445 and CAMEL-26446 (an {{AsyncProcessor}} 
> that throws from {{process(exchange, callback)}} instead of setting the 
> exception on the exchange), named in the review of CAMEL-26446; the same on 
> main.
> The steps inside a {{doTry}} block, and inside an {{onException}}, have no 
> error handler. When such a step is an {{AsyncProcessor}} that throws, the 
> exception goes from {{CamelInternalProcessor}} (through 
> {{StepHelper.process}}) up to the reactive work of {{Pipeline}}, 
> {{DefaultReactiveExecutor}} logs and drops it ({noformat}Error executing 
> reactive work due to ... This exception is ignored.{noformat}), and the 
> callback is never called: the exchange hangs (and in a {{doTry}}, the 
> {{doCatch}} never runs). The same processor setting the exception on the 
> exchange is caught by the {{doCatch}}; a plain {{Processor}} that throws is 
> caught too (its converter catches it).
> {code:java}
> from("direct:start")
>     .doTry()
>         .process(asyncProcessorThatThrows)
>     .doCatch(IllegalStateException.class)
>         .to("mock:caught")
>     .end();
> from("direct:other")
>     .onException(IllegalStateException.class).handled(true)
>         .process(asyncProcessorThatThrows)
>         .to("mock:handled")
>     .end()
>     .throwException(new IllegalStateException("failed"));
> {code}
> Camel's own processors throw from {{process(exchange, callback)}} only in 
> their "not started" guards ({{RecipientList}}, {{WireTapProcessor}}, 
> {{ThreadsProcessor}}).
> *Proposal*
> Catch the exception where the step of the block is called (the processor of 
> the step in {{CamelInternalProcessor}}, or the task of the {{Pipeline}}), 
> with the same exactly-once rule as the fixes for the error handlers: before 
> the callback, fail the exchange with it through the reactive executor after 
> the work already queued there; after the callback, leave it to the caller as 
> today. The fix for {{noErrorHandler()}} is in {{NoErrorHandler}} 
> (CAMEL-26461), where a callback object per step exists already; these layers 
> run every step of every route with pooled tasks, so the exactly-once flag 
> needs care there. Tests as for those fixes, with a {{doCatch}} that catches 
> the thrown exception, and in an {{onException}}.
> _Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to