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

Work on CAMEL-26706 started by shashank.
----------------------------------------
> camel-core - Aggregate EIP: an AggregationStrategy whose onCompletion throws 
> leaves the aggregated exchange in progress, so a recoverable repository never 
> recovers it
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-26706
>                 URL: https://issues.apache.org/jira/browse/CAMEL-26706
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>
> When a group completes, {{AggregateProcessor.onSubmitCompletion}} first books 
> the aggregated exchange as in progress ({{inProgressCount}} and 
> {{inProgressCompleteExchanges}}), then calls 
> {{aggregationStrategy.onCompletion(exchange)}}, and only after that adds the 
> {{AggregateOnCompletion}} that undoes the booking. If {{onCompletion}} 
> throws, nothing undoes it: the aggregated exchange is never sent, never 
> failed and never confirmed.
> By then the group has been removed from the aggregation repository. A 
> recoverable repository (such as {{JdbcAggregationRepository}}) has moved it 
> to its completed store, but its recover task skips it on every run as 
> "already in progress", so the group is neither delivered nor recovered until 
> the CamelContext is restarted. The in progress count also stays above 0, so a 
> stop with {{forceCompletionOnStop}} or {{completeAllOnStop}} waits until the 
> shutdown timeout. With {{completionFromBatchConsumer}}, the other groups 
> completed in the same batch are not submitted at all and are lost the same 
> way.
> {code:java}
> from("direct:start")
>     .aggregate(header("id"), strategyWhoseOnCompletionThrowsOnce)
>     .aggregationRepository(recoverableRepository).completionSize(2)
>     .to("mock:aggregated");
> // send A1 and A2 with id A: the sender of A2 gets the exception from 
> onCompletion,
> // and A1+A2 never reaches mock:aggregated, although it is in the completed 
> store
> {code}
> The javadoc of {{onCompletion}} says it must not throw. Even so, CAMEL-26575 
> made Multicast, Split and Recipient List fail the exchange in that case 
> instead of hanging it, and CAMEL-26309 fixed the same lost group for a 
> rejected thread pool task ({{onRejectedCompletion}}), but the throw happens 
> before the on completion is registered, so that fix does not cover it.
> Expected: the aggregated exchange fails as when the thread pool rejects it 
> (its on completions run, so it is no longer in progress and is not confirmed, 
> and a recoverable repository recovers it), it is passed to the exception 
> handler, and the sender still gets the exception. The other groups of a batch 
> are still sent.
> _Filed with Claude Code on behalf of allthingssecurity._



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

Reply via email to