[
https://issues.apache.org/jira/browse/CAMEL-24950?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen resolved CAMEL-24950.
---------------------------------
Fix Version/s: 4.23.0
Resolution: Fixed
The fix is merged on main, so it is in Camel 4.23.0:
* 7705d668cba0 CAMEL-24950: camel-seda - complete the exchanges discarded by
purging the queue
Resolving, as the ticket was not updated when the PR was merged.
_Claude Code on behalf of Claus Ibsen_
> camel-seda - purging the queue leaves request/reply producers waiting for
> exchanges that were discarded (forever with timeout=0)
> --------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-24950
> URL: https://issues.apache.org/jira/browse/CAMEL-24950
> Project: Camel
> Issue Type: Bug
> Components: camel-seda
> Reporter: shashank
> Priority: Minor
> Fix For: 4.23.0
>
>
> {{SedaEndpoint.purgeQueue()}} is just {{queue.clear()}}. It is called:
> * from {{SedaConsumer.doStop()}} and from {{getPendingExchangesSize()}} when
> {{purgeWhenStopping=true}};
> * from the JMX operation.
> A request/reply exchange sent with
> {{waitForTaskToComplete=Always}}/{{IfReplyExpected}} is a copy whose
> {{onDone}} synchronization counts down the producer's latch
> (SedaProducer.java:70-106). The purge drops the copy without completing it,
> so the producer keeps waiting:
> * with a timeout, it waits the full timeout and then gets
> {{ExchangeTimedOutException}};
> * with {{timeout=0}} (documented as "disable timeout"), it waits forever.
> Reproduced against 4.23.0-SNAPSHOT: route
> {{from("seda:svc?purgeWhenStopping=true")}} busy with one message, then a
> request {{seda:svc?timeout=0}}, then {{stopRoute("svc")}}:
> {noformat}
> route 'svc' status: Stopped
> 3 s after the stop, requester thread state=WAITING in
> SedaProducer.process(SedaProducer.java:142)
> {noformat}
> With {{timeout=6000}}, the requester returned {{ExchangeTimedOutException}}
> after 6007 ms, although its request had been discarded about 1.5 s after it
> was sent. The producer's own route cannot shut down gracefully while that
> thread waits, because the exchange is still inflight there.
> Proposed fix: when purging, drain the queue ({{drainTo}}) instead of
> {{clear()}}, fail each discarded exchange with
> {{RejectedExecutionException("Exchange discarded as the SEDA queue was
> purged")}} and run its on completions
> ({{UnitOfWorkHelper.doneSynchronizations(exchange,
> exchange.getExchangeExtension().handoverCompletions())}}, as {{SedaConsumer}}
> does after a multicast). Waiting producers are released with that exception.
> Behaviour change to call out: on completions handed over to a discarded
> InOnly exchange (e.g. the file consumer's commit/rollback,
> {{onCompletion().onFailureOnly()}}) now run as a failure, on the thread that
> purges (shutdown task or JMX). Previously they never ran.
> A PR with the fix follows, with regression test
> {{SedaPurgeWhenStoppingWaitingProducerTest}} (stop with
> {{purgeWhenStopping}}, and a JMX-style {{purgeQueue()}}), plus an
> upgrade-guide note.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)