[
https://issues.apache.org/jira/browse/CAMEL-24069?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Federico Mariani updated CAMEL-24069:
-------------------------------------
Attachment: SpringRabbitMQAsyncConsumerExceptionHandlerTest.java
> camel-spring-rabbitmq - asyncConsumer failures are dropped because the
> endpoint exception handler is used instead of the consumer exception handler
> ---------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-24069
> URL: https://issues.apache.org/jira/browse/CAMEL-24069
> Project: Camel
> Issue Type: Bug
> Components: camel-spring-rabbitmq
> Affects Versions: 4.22.0
> Reporter: Federico Mariani
> Priority: Major
> Attachments: SpringRabbitMQAsyncConsumerExceptionHandlerTest.java
>
>
> When {{asyncConsumer=true}} and an exchange fails after the listener method
> has already returned (asynchronous completion),
> {{EndpointMessageListener$EndpointMessageListenerAsyncCallback.done()}}
> reports the failure via the endpoint-level exception handler:
> {code:java}
> } else {
> // we were done async, so use the endpoint error handler
> if (endpoint.getExceptionHandler() != null) {
> endpoint.getExceptionHandler().handleException(rce);
> }
> }
> {code}
> {{endpoint.getExceptionHandler()}} is {{null}} unless the user explicitly
> configured {{exceptionHandler}} on the endpoint, and there is no fallback -
> so the exception is dropped. At this point the message has already been
> acknowledged (the Spring listener container acks when {{onMessage}} returns),
> so no redelivery / retry-interceptor / DLQ handling can apply either.
> Failures that pass through the route error handler are at least logged there,
> but failures that do not - e.g. an exception thrown while *sending the reply*
> of an InOut exchange, or the rollback wrapper - disappear without a single
> log line.
> The listener should fall back to the *consumer's* exception handler:
> {{DefaultConsumer}} always has one (defaulting to
> {{LoggingExceptionHandler}}), and {{EndpointMessageListener}} already holds
> the consumer reference. For comparison, camel-jms in the equivalent code path
> calls {{endpoint.getErrorHandler().handleError(rce)}}, which is a guaranteed
> non-null logging handler.
> Attached unit test (no broker needed) registers a recording exception handler
> on the consumer, drives {{EndpointMessageListener.onMessage}} with an
> async-failing processor, and fails on current main because the handler is
> never invoked:
> {noformat}
> async failure should be passed to the consumer exception handler ==>
> expected: <false> but was: <true> within 5 seconds.
> {noformat}
> ----
> _This issue was found during an AI-assisted code review of
> camel-spring-rabbitmq: Claude Code on behalf of Federico Mariani (fmariani).
> A failing unit test reproducing the issue is attached._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)