Claus Ibsen created CAMEL-25082:
-----------------------------------
Summary: camel-disruptor - a request/reply timeout marks the
caller's exchange as ignored, so a redelivery or fallback to disruptor is
dropped
Key: CAMEL-25082
URL: https://issues.apache.org/jira/browse/CAMEL-25082
Project: Camel
Issue Type: Bug
Components: camel-disruptor
Reporter: Claus Ibsen
When a request/reply send to a disruptor endpoint times out,
{{DisruptorProducer}} sets the property
{{DisruptorEndpoint.DISRUPTOR_IGNORE_EXCHANGE}} so the consumer skips the
timed-out exchange if it has not processed it yet. The property is set on the
*caller's* exchange, not on the copy that was published into the ring buffer:
{code:java}
final Exchange copy = prepareCopy(exchange, false); // published
...
exchange.setProperty(DisruptorEndpoint.DISRUPTOR_IGNORE_EXCHANGE, true); //
on timeout
{code}
So:
# the published copy never carries the property, and the consumer still
processes a timed-out exchange that it had not started yet;
# the caller's exchange keeps the property, and every later copy of it inherits
it ({{prepareCopy}} copies the properties). {{DisruptorConsumer}} drops any
exchange that has the property (it checks {{containsKey}}, not the value),
without a log above TRACE. So:
#* a redelivery by the error handler after the timeout is dropped by the
consumer, and times out again: redeliveries can never succeed;
#* a fallback to another disruptor endpoint, e.g.
{{doCatch(ExchangeTimedOutException.class).to("disruptor:fallback")}}, is
dropped: an InOnly fallback message is lost silently, an InOut one times out
again.
The same check is applied in {{DisruptorReference}} to exchanges buffered while
the disruptor is reconfigured.
The property should be set on the published copy, and the consumer should
honour the value of the property. camel-seda is not affected: {{SedaProducer}}
removes the timed-out copy from the queue and does not mark the caller's
exchange.
Found in the review of CAMEL-25038 (PR #26913).
_Claude Code on behalf of davsclaus_
--
This message was sent by Atlassian Jira
(v8.20.10#820010)