shashank created CAMEL-26046:
--------------------------------

             Summary: camel-pulsar - deadLetterTopic is ignored with 
enableRetry=true, and enableRetry without maxRedeliverCount fails with a 
NullPointerException
                 Key: CAMEL-26046
                 URL: https://issues.apache.org/jira/browse/CAMEL-26046
             Project: Camel
          Issue Type: Bug
          Components: camel-pulsar
            Reporter: shashank
            Assignee: shashank


With {{enableRetry=true}}, {{CommonCreationStrategyImpl.getBuilder}} builds the 
{{DeadLetterPolicy}} with {{maxRedeliverCount}} and {{retryLetterTopic}}, but 
not with {{deadLetterTopic}}; only the branch without retry mode copies it 
(main 9f839f4bcc9d, since CAMEL-17840). In pulsar-client 4.2.4, 
{{ConsumerBuilderImpl.subscribeAsync}} in retry mode replaces a blank dead 
letter topic of the policy with its default {{<topic>-<subscription>-DLQ}} (or 
{{<subscription>-DLQ}} when that topic exists), and keeps a non-blank one. So a 
message that failed {{maxRedeliverCount}} times (Camel negatively acknowledges 
a failed exchange) goes to the default topic, not to the configured 
{{deadLetterTopic}}, and the route that reads the configured topic never sees 
it. In the same branch, {{enableRetry=true}} without {{maxRedeliverCount}} 
unboxes a null {{Integer}} into 
{{DeadLetterPolicyBuilder.maxRedeliverCount(int)}}, and the consumer fails to 
start with a {{NullPointerException}}.

*Fix*: in retry mode the configured {{deadLetterTopic}} is set on the policy, 
and without {{maxRedeliverCount}} no policy is created, as the option 
description says, so the consumer starts and the Pulsar client applies its own 
retry-mode policy (in 4.2.4: {{maxRedeliverCount(16)}} with the default retry 
letter and dead letter topics). As without retry mode, the topics only apply 
when {{maxRedeliverCount}} is set. Without retry mode nothing changes. Upgrade 
guide (4.24) entry.

*Tests*: new {{CommonCreationStrategyImplTest}}, 6 tests, on the real Pulsar 
{{ConsumerBuilderImpl}} (a {{PulsarClient}} for {{pulsar://localhost:6650}}, 
which does not connect before a subscribe) and its 
{{ConsumerConfigurationData}}.
* {{retryModeUsesTheConfiguredDeadLetterTopic}} fails on main: {{the dead 
letter topic must be passed to the Pulsar client in retry mode ==> expected: 
<persistent://public/default/my-dlq> but was: <null>}};
* {{retryModeWithoutMaxRedeliverCountLeavesThePolicyToThePulsarClient}} and 
{{retryModeWithoutMaxRedeliverCountIgnoresTheTopicsAsWithoutRetryMode}} fail on 
main with the {{NullPointerException}};
* three controls (retry mode without topics, dead letter mode, no policy 
without maxRedeliverCount) pass on main and with the fix.
Unit tests of camel-pulsar with the fix: 40 run, 0 failures.

*How it was found*: checking option descriptions against the code (doc-claim 
mining), and the retry-mode defaulting read from the pulsar-client 4.2.4 jar 
({{ConsumerBuilderImpl}}, {{ConsumerImpl}}).

*Affected*: main, camel-4.23.x, camel-4.22.x and camel-4.18.x (same code). 
Read, not run.

_Filed with Claude Code on behalf of allthingssecurity._



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

Reply via email to