[ https://issues.apache.org/jira/browse/CAMEL-22026?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17947800#comment-17947800 ]
Kartik commented on CAMEL-22026: -------------------------------- [~davsclaus] Review and adjust the priority I have made it as major issue > Camel SJMS & SJMS2 component cause thread leak when the route is stopped. > ------------------------------------------------------------------------- > > Key: CAMEL-22026 > URL: https://issues.apache.org/jira/browse/CAMEL-22026 > Project: Camel > Issue Type: Bug > Components: camel-sjms, camel-sjms2 > Affects Versions: 3.22.3 > Environment: Java 17 > Tried with Camel 3.14.9, Latest 3.x and 4.x issue is seen even in latest build > ActiveMQ broker 6.x > > Reporter: Kartik > Priority: Major > Attachments: image-2025-04-28-16-51-43-419.png > > > The camel sjms and sjms2 component cause thread to leak and the connection is > kept open despite the route is stopped. > I am using ActiveMQ broker with apache Qpid library and I can see the below 2 > threads will keep running despite calling route stop. > The issue comes is caused by > "{*}SimpleMessageListenerContainer.java#SimpleMessageListenerContainer()"{*} > function > {code:java} > protected void stopConnection() { > synchronized (this.connectionLock) { > this.connectionStarted = false; > if (this.connection != null) { > try { > this.connection.stop(); > } catch (Exception e) { > LOG.debug("Error stopping connection. This exception is > ignored.", e); > } > } > } > } {code} > We should call "this.connection.close()" in doShutdown() function not doing > this will only close *JMSSession* but keeps the underlying QPID Executor > service and connection open to the broker. > Below simple exception will replicate the issue. > {code:java} > CamelContext context = new DefaultCamelContext(); context.addRoutes(new > RouteBuilder() > { > @Override > public void configure() throws Exception > { > JmsConnectionFactory connectionFactory = new > JmsConnectionFactory("amqp://localhost:5672"); > getCamelContext().getRegistry().bind("qpidConnectionFactory", > connectionFactory); > from("sjms:topic:demo?connectionFactory=#qpidConnectionFactory") > .process(exchange -> { > System.out.println(exchange.getIn().getBody()); > }); > } > }); > context.start(); > System.out.println("Started"); > System.out.println("Stopping route"); > context.stop(); > Thread.sleep(100000L); > // Take thread dump{code} > When I take thread dump after stopping the camel context I still see below 2 > threads running and I see an active connection in ActiveMQ broker also. > {code:java} > "QpidJMS Connection Executor: ID:e8acc451-5008-4cb2-a867-d64b9e5350d6:1" #16 > prio=5 os_prio=0 cpu=0.00ms elapsed=11.30s allocated=3856B defined_classes=0 > tid=0x000001f1e7cf1000 nid=0x670c waiting on condition [0x000000cd040fe000] > java.lang.Thread.State: WAITING (parking) at > jdk.internal.misc.Unsafe.park(java.base@11.0.15/Native Method) - > parking to wait for <0x00000006241900f0> (a > java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) > at > java.util.concurrent.locks.LockSupport.park(java.base@11.0.15/LockSupport.java:194) > at > java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.15/AbstractQueuedSynchronizer.java:2081) > at > java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.15/LinkedBlockingQueue.java:433) > at > java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.15/ThreadPoolExecutor.java:1054) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.15/ThreadPoolExecutor.java:1114) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.15/ThreadPoolExecutor.java:628) > at java.lang.Thread.run(java.base@11.0.15/Thread.java:829) > "AmqpProvider :(1):[amqp://localhost:5672]" #17 daemon prio=5 os_prio=0 > cpu=46.88ms elapsed=9.96s allocated=8634K defined_classes=176 > tid=0x000001f1e72ac000 nid=0x6298 runnable [0x000000cd041fe000] > java.lang.Thread.State: RUNNABLE at > sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(java.base@11.0.15/Native > Method) at > sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(java.base@11.0.15/WindowsSelectorImpl.java:357) > at > sun.nio.ch.WindowsSelectorImpl.doSelect(java.base@11.0.15/WindowsSelectorImpl.java:182) > at > sun.nio.ch.SelectorImpl.lockAndDoSelect(java.base@11.0.15/SelectorImpl.java:124) > - locked <0x00000006235200f8> (a > io.netty.channel.nio.SelectedSelectionKeySet) - locked > <0x000000062350c728> (a sun.nio.ch.WindowsSelectorImpl) at > sun.nio.ch.SelectorImpl.select(java.base@11.0.15/SelectorImpl.java:136) > at > io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:62) > at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:891) > at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:526) at > io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998) > at > io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) > at java.lang.Thread.run(java.base@11.0.15/Thread.java:829) {code} > > !image-2025-04-28-16-51-43-419.png! -- This message was sent by Atlassian Jira (v8.20.10#820010)