[
https://issues.apache.org/jira/browse/CAMEL-26603?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen updated CAMEL-26603:
--------------------------------
Fix Version/s: 4.24.0
> camel-core - Aggregate EIP: forceCompletionOnStop loses the messages that the
> consumer routes during the graceful shutdown
> --------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-26603
> URL: https://issues.apache.org/jira/browse/CAMEL-26603
> Project: Camel
> Issue Type: Bug
> Components: camel-core
> Reporter: shashank
> Assignee: shashank
> Priority: Major
> Fix For: 4.24.0
>
>
> Found with Fray (controlled concurrency testing for the JVM): two threads
> sending to an aggregator with {{forceCompletionOnStop}} while a third stops
> the route; every send returned without error, but only the messages that
> arrived before the stop came out of the aggregator.
> When a route stops, {{DefaultShutdownStrategy}} first calls
> {{prepareShutdown(false, false)}} on the route services, so the aggregator
> completes its groups, and then waits for the inflight and pending exchanges.
> Consumers that defer their shutdown (seda, direct, and others) keep routing
> during that wait; seda drains its queue. Their messages start new groups.
> After the wait the strategy stops the deferred consumers and calls
> {{prepareShutdown}} again, and the aggregator completes the new groups then.
> But stopping a {{DefaultConsumer}} stops its processor, which is the whole
> route, so the aggregated exchange fails with {{RouteStoppingException}} ("The
> exchange cannot continue: its route is being stopped or reloaded"), logged at
> WARN by the aggregator, and those messages are lost, although their senders
> (and a seda queue) had handed them over.
> {code:java}
> from("seda:in")
> .aggregate(constant(true),
> AggregationStrategies.groupedBody()).completionSize(100)
> .forceCompletionOnStop()
> .to("mock:out");
> // one message aggregated, one in flight, two waiting in the seda queue, then
> stopRoute:
> // mock:out gets only the first group; the other three messages are lost
> (WARN with RouteStoppingException)
> {code}
> The same happens when the CamelContext stops.
> Expected: with {{forceCompletionOnStop}}, the messages that the route still
> accepts while it stops are completed and sent on too.
> Suggested fix: in {{DefaultShutdownStrategy}}, prepare the route services
> again (not forced) after the deferred consumers have been prepared and before
> they are stopped, so the aggregator completes these groups while the route
> can still process them (it waits for its in-progress completions there).
> _Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)