[
https://issues.apache.org/jira/browse/CAMEL-22026?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen resolved CAMEL-22026.
---------------------------------
Resolution: Fixed
> 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, 4.11.0
> 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
> Assignee: Claus Ibsen
> Priority: Major
> Fix For: 4.8.7, 4.10.5, 4.12.0
>
> 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#stopConnection()"{*} 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 code 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([email protected]/Native Method) -
> parking to wait for <0x00000006241900f0> (a
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at
> java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:194)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await([email protected]/AbstractQueuedSynchronizer.java:2081)
> at
> java.util.concurrent.LinkedBlockingQueue.take([email protected]/LinkedBlockingQueue.java:433)
> at
> java.util.concurrent.ThreadPoolExecutor.getTask([email protected]/ThreadPoolExecutor.java:1054)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker([email protected]/ThreadPoolExecutor.java:1114)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run([email protected]/ThreadPoolExecutor.java:628)
> at java.lang.Thread.run([email protected]/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([email protected]/Native
> Method) at
> sun.nio.ch.WindowsSelectorImpl$SubSelector.poll([email protected]/WindowsSelectorImpl.java:357)
> at
> sun.nio.ch.WindowsSelectorImpl.doSelect([email protected]/WindowsSelectorImpl.java:182)
> at
> sun.nio.ch.SelectorImpl.lockAndDoSelect([email protected]/SelectorImpl.java:124)
> - locked <0x00000006235200f8> (a
> io.netty.channel.nio.SelectedSelectionKeySet) - locked
> <0x000000062350c728> (a sun.nio.ch.WindowsSelectorImpl) at
> sun.nio.ch.SelectorImpl.select([email protected]/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([email protected]/Thread.java:829) {code}
>
> !image-2025-04-28-16-51-43-419.png!
--
This message was sent by Atlassian Jira
(v8.20.10#820010)