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

Claus Ibsen resolved CAMEL-24949.
---------------------------------
    Fix Version/s: 4.23.0
       Resolution: Fixed

The fix is merged on main, so it is in Camel 4.23.0:
* dc95b0ed26d9 CAMEL-24949: camel-seda - do not purge the queue when suspending 
a route with purgeWhenStopping
* 8a0e43065f86 CAMEL-24949: camel-seda - Insert the upgrade guide section in 
alphabetical order

Resolving, as the ticket was not updated when the PR was merged.

_Claude Code on behalf of Claus Ibsen_

> camel-seda - suspending a route with purgeWhenStopping=true discards all 
> queued messages
> ----------------------------------------------------------------------------------------
>
>                 Key: CAMEL-24949
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24949
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-seda
>            Reporter: shashank
>            Priority: Minor
>             Fix For: 4.23.0
>
>
> {{purgeWhenStopping}} is documented as "Whether to purge the task queue when 
> stopping the consumer/route". Suspending the route purges the queue as well:
> * {{DefaultShutdownStrategy}} uses the same {{ShutdownTask}} wait loop for 
> suspend and shutdown.
> * The loop asks every {{ShutdownAware}} consumer for 
> {{getPendingExchangesSize()}} (DefaultShutdownStrategy.java:674, :772-788).
> * {{SedaConsumer.getPendingExchangesSize()}} purges the queue whenever 
> {{purgeWhenStopping}} is set (SedaConsumer.java:88-95). It does not know that 
> this is only a suspend.
> This affects {{routeController.suspendRoute(id)}}, {{camelContext.suspend()}} 
> and suspending via JMX.
> Reproduced against 4.23.0-SNAPSHOT. Route 
> {{from("seda:work?purgeWhenStopping=...")}}, with 5 messages sent, m1 in 
> progress and 4 queued, then {{suspendRoute("work")}} and later 
> {{resumeRoute("work")}}:
> {noformat}
> purgeWhenStopping=false: after suspendRoute delivered [m1, m2, m3, m4, m5] -> 
> 0 lost
> purgeWhenStopping=true : after suspendRoute delivered [m1]; after resumeRoute 
> still [m1] -> 4 lost
> {noformat}
> Nothing is logged above DEBUG.
> {{SedaConsumer.prepareShutdown(suspendOnly, ...)}} already skips its shutdown 
> logic when only suspending, so a suspend is clearly not meant to behave like 
> a stop.
> Proposed fix: only purge when the route/consumer is being stopped. The 
> consumer cannot tell a suspend from a stop while the wait loop runs (the 
> route and consumer are still Started), so the shutdown strategy has to pass 
> it:
> * add a default method {{ShutdownAware.getPendingExchangesSize(boolean 
> suspendOnly)}} (camel-api, {{@since 4.23}}) that delegates to 
> {{getPendingExchangesSize()}};
> * {{DefaultShutdownStrategy}} calls it with its {{suspendOnly}} flag (the 
> protected static {{getPendingInflightExchanges(order)}} is kept and delegates 
> with {{false}});
> * {{SedaConsumer}} overrides it and purges only when {{!suspendOnly}}. A 
> suspend then completes the queued messages first, as it already does without 
> {{purgeWhenStopping}}. The purge on stop (loop and {{doStop()}}) is unchanged.
> The alternative of calling {{prepareShutdown(true, false)}} on deferred 
> consumers before the loop was not taken: it changes the call sequence for 
> every {{ShutdownAware}} consumer. The SPI addition is the one design point 
> for reviewers.
> A PR with the fix follows, with regression test 
> {{SedaPurgeWhenStoppingSuspendTest}}, plus an upgrade-guide note.



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

Reply via email to