[ https://issues.apache.org/jira/browse/CAMEL-22390?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18017037#comment-18017037 ]
Claus Ibsen commented on CAMEL-22390: ------------------------------------- https://camel.zulipchat.com/#narrow/channel/257298-camel/topic/Infinite.20loop.20when.20interrupt.20SedaConsumer/with/534438627 > 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)