Claus Ibsen created CAMEL-25753:
-----------------------------------

             Summary: camel-kafka - stop the consumer without waiting for its 
current poll, so a reload with several Kafka routes is fast and logs no errors
                 Key: CAMEL-25753
                 URL: https://issues.apache.org/jira/browse/CAMEL-25753
             Project: Camel
          Issue Type: Improvement
          Components: camel-kafka
            Reporter: Claus Ibsen
             Fix For: 4.24.0


A Kafka consumer stops only after its current poll returns. 
KafkaFetchRecords.startPolling() takes the lock before the poll loop and 
releases it after the loop. safeStop() waits for that lock (up to 
shutdownTimeout) and only then calls consumer.wakeup(). So the wakeup, which is 
meant to break a blocking poll, comes after the poll has returned. Pausing the 
consumer (the suspend phase of a graceful shutdown) waits for the poll in the 
same way. Each consumer needs up to pollTimeoutMs (5000 ms by default) to pause 
and to stop, and the routes stop one after another.

With camel run --dev, the shutdown timeout is 5 seconds (Run.java). A reload 
with two or more Kafka consumer routes goes past it:

{noformat}
WARN  DefaultShutdownStrategy : Timeout occurred during graceful shutdown. 
Forcing the routes to be shutdown now. Notice: some resources may still be 
running as graceful shutdown did not complete successfully.
ERROR ClassicKafkaConsumer : [Consumer clientId=consumer-..., groupId=...] 
Failed to close coordinator with a timeout(ms)=30000
ERROR KafkaProducer : [Producer clientId=producer-4] Interrupted while joining 
ioThread
ERROR KafkaFetchRecords : Error closing the Kafka consumer: 
java.lang.InterruptedException (this error will be ignored)
{noformat}

These errors come on every such reload, while nothing is wrong with the routes. 
In production (shutdown timeout 45 s), an application with many Kafka consumer 
routes is slow to stop.

Measured with three consumer routes on a local broker: the first consumer took 
2.6 s to stop, and the second was still stopping when the 5 s ran out.

Workaround: a lower poll timeout, for example 
camel.component.kafka.pollTimeoutMs=500.

Proposal: wake the consumer when the stop (and the pause) begins. wakeup() is 
thread safe and only affects a blocking call. The poll loop then treats the 
WakeupException as the stop.

Found while adding the kafka-orders example to the AI benchmark.

_Claude Code on behalf of davsclaus_



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

Reply via email to