Kartik created CAMEL-22026:
------------------------------

             Summary: 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
         Attachments: image-2025-04-28-16-51-43-419.png

The came 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)

Reply via email to