You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Jérôme FOUILLOY (Jira)" <ji...@apache.org> on 2025/08/29 12:46:00 UTC
[jira] [Created] (CAMEL-22390) Infinite loop on interrupt SedaConsumer
Jérôme FOUILLOY created CAMEL-22390:
---------------------------------------
Summary: Infinite loop on interrupt SedaConsumer
Key: CAMEL-22390
URL: https://issues.apache.org/jira/browse/CAMEL-22390
Project: Camel
Issue Type: Bug
Components: camel-seda
Affects Versions: 4.4.0, 4.x
Environment: Problem detected on Linux, reproduced on Windows 11 OpenJDK 17.
Bug applicable to all environment.
Reporter: Jérôme FOUILLOY
Attachments: Infinite loop interrupt SedaConsumer.zip
We use camel 4.9.0 with Karaf, since update version from version greater than 4.3 we have infinite loop when my code interrupts an SedaConsumer thread to ask the end of processor.
The commit https://github.com/apache/camel/commit/1c73ce90679ab0cc5e5bdb36b4e221462af7ef56 has added interrupt on catch(InterruptedException) in SedaConsumer.
The infinite loop comes from following code :
Exchange exchange = null;
try {
// use the end user configured poll timeout
exchange = queue.poll(pollTimeout, TimeUnit.MILLISECONDS);
if (LOG.isTraceEnabled()) {
LOG.trace("Polled queue {} with timeout {} ms. -> {}", ObjectHelper.getIdentityHashCode(queue), pollTimeout,
exchange);
}
...
} catch (InterruptedException e) {
LOG.debug("Sleep interrupted, are we stopping? {}", isStopping() || isStopped());
Thread.currentThread().interrupt();
} catch (Exception e) {
if (exchange != null) {
getExceptionHandler().handleException("Error processing exchange", exchange, e);
} else {
getExceptionHandler().handleException(e);
}
}
My code requests to interrupt the thread SedaConsumer , the queue.poll detects interrupted status then it throws an exception, the SedaConsumer catches the exception, it marks the camel thread as interrupted, on next loop the camel thread calls queue.poll(…) who throws InterruptedException.
=> Infinite loop, the thread consumes about 10% CPU and never terminate, it creates memory leak with 100Mo in several seconds on my local computer. The DEBUG log spams with message "DEBUG Sleep interrupted, are we stopping? false"
May be my code shouldn't interrupt seda thread, but SedaThread should be never create infinite loop on interrupt.
I think that main while of SedaConsumer should check an boolean with interrupted status set in catch(InterruptedException) instead to call interrupt() again.
I have written code to reproduce the problem, see attached zip file with unit test.
I have written a patch fix that works fine in my stack, it based on stop the while when interrupt is received.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)