[ 
https://issues.apache.org/jira/browse/CAMEL-24932?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18118336#comment-18118336
 ] 

Andrea Cosentino commented on CAMEL-24932:
------------------------------------------

PR opened: https://github.com/apache/camel/pull/26778

Verified by reverting the fix: the new test then fails because the NPE kills 
the polling thread before the handler is ever reached.

----
_Claude Code on behalf of oscerd (Andrea Cosentino)._

> camel-pulsar - the polling loop dies on a NullPointerException when a receive 
> fails
> -----------------------------------------------------------------------------------
>
>                 Key: CAMEL-24932
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24932
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-pulsar
>            Reporter: Andrea Cosentino
>            Assignee: Andrea Cosentino
>            Priority: Major
>
> h3. Summary
> With {{messageListener=false}}, the polling loop reports its own errors 
> through
> {{endpoint.getExceptionHandler()}}, which is {{null}} unless the route 
> configures one. The resulting
> {{NullPointerException}} escapes {{run()}}, the consumer thread dies, and 
> that consumer silently stops
> receiving messages.
> h3. Details
> {{PulsarConsumer.PulsarConsumerLoop.run()}}:
> {code:java}
> while (running && isRunAllowed()) {
>     try {
>         Message<byte[]> msg = consumer.receive();
>         listener.received(consumer, msg);
>     } catch (PulsarClientException e) {
>         if (e.getCause() instanceof InterruptedException) {
>             ...
>             running = false;
>         } else {
>             endpoint.getExceptionHandler().handleException(e);
>         }
>     } catch (Exception e) {
>         endpoint.getExceptionHandler().handleException(e);
>     }
> }
> {code}
> {{getExceptionHandler()}} here resolves to {{DefaultEndpoint}}'s 
> {{@UriParam}} field, which stays
> {{null}} unless the route sets {{?exceptionHandler=#bean}}. 
> {{bridgeErrorHandler=true}} does not help
> either: {{DefaultEndpoint.configureConsumer}} installs both the bridging 
> handler and a custom handler on
> the *consumer*, never on the endpoint.
> So any {{PulsarClientException}} from {{consumer.receive()}} whose cause is 
> not an interrupt - a broker
> reconnect, a topic unload, a timeout - and any other {{Exception}}, throws an 
> NPE from inside the catch
> block. The NPE propagates out of {{run()}} into the {{Future}} returned by 
> {{executor.submit(...)}},
> which is discarded, so nothing is logged at all. The thread is gone and the 
> loop is not restarted, so
> that consumer stops consuming for the lifetime of the route.
> h3. Scope
> Only reachable with {{messageListener=false}}; the default is {{true}}, which 
> uses
> {{PulsarMessageListener}} instead. That one already does the right thing and 
> calls
> {{pulsarConsumer.getExceptionHandler()}}.
> h3. Proposed fix
> Use the consumer's exception handler, which {{DefaultConsumer}} always 
> initialises, exactly as
> {{PulsarMessageListener}} does. Worth also considering whether the loop 
> should keep running after an
> unknown error, but the immediate defect is the NPE.
> ----
> _Reported by Claude Code on behalf of oscerd (Andrea Cosentino)._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to