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

Work on CAMEL-26707 started by shashank.
----------------------------------------
> camel-core - Idempotent Consumer: an exchange marked rollback only keeps its 
> message id, so the redelivered message is dropped as a duplicate
> ---------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-26707
>                 URL: https://issues.apache.org/jira/browse/CAMEL-26707
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>
> {{markRollbackOnly()}} and {{markRollbackOnlyLast()}} mark the exchange for 
> rollback without setting an exception, so the unit of work runs the on 
> completions as successful ({{exchange.isFailed()}} only checks the 
> exception). {{IdempotentOnCompletion.onComplete}} then confirms the message 
> id (or adds it, with {{eager=false}}) instead of removing it, and 
> {{removeOnFailure}} has no effect. {{completionEager}} goes through the same 
> {{onComplete}}.
> A consumer that does not commit a rollback only exchange (such as the SQL 
> consumer, which then skips {{onConsume}} since CAMEL-25527, or a transacted 
> JMS consumer) redelivers the message. The Idempotent Consumer finds its 
> message id and drops the redelivery as a duplicate, and the consumer then 
> commits it: the message was never processed, and the dropped duplicate is 
> only logged at DEBUG. This happens with the default options, with any 
> idempotent repository that is not enlisted in the transaction that is rolled 
> back.
> {code:java}
> from("sql:select * from inbox where consumed = false?onConsume=update inbox 
> set consumed = true where id = :#id")
>     .idempotentConsumer(simple("${body[msgid]}"), repository)
>     .choice().when(dependencyNotReady).markRollbackOnly().end()
>     .to("direct:process");
> // first poll: rolled back, the row stays unconsumed, but the message id is 
> confirmed
> // second poll: "Ignoring duplicate message", and onConsume marks the row 
> consumed
> {code}
> The SQL consumer already treats a rollback only exchange as failed 
> ({{SqlConsumer}}: "a rollback only exchange (without an exception) did not 
> complete successfully either" (CAMEL-25527, CAMEL-25588)); 
> {{PipelineHelper.continueProcessing}} also stops on {{isRollbackOnly() || 
> isRollbackOnlyLast()}}.
> Expected: with {{removeOnFailure=true}} (the default) the message id of a 
> rollback only exchange is removed, as for a failed one, so the redelivered 
> message is processed.
> _Filed with Claude Code on behalf of allthingssecurity._



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

Reply via email to