[ https://issues.apache.org/jira/browse/CAMEL-22390?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18017023#comment-18017023 ]
Claus Ibsen commented on CAMEL-22390: ------------------------------------- As an end user you are not really supposed to call interrupt on camel threads. If you want to stop Camel then use its stop methods for that. What happens inside Camel is implementation details and not for end users to "mess with". > 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.9.0, 4.x > Environment: Problem detected on Linux, reproduced on Windows 11 > OpenJDK 17. > Bug applicable to all environment. > Reporter: Jérôme FOUILLOY > Priority: Minor > Attachments: 0001-Fix-infinite-loop-on-interrupt-SedaConsumer.patch, > 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 :_ > {code:java} > 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); > } > }{code} > 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)