Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在tomcat上正常关闭ActiveMQ会话线程_Tomcat_Spring Boot_Jms_Activemq_Spring Jms - Fatal编程技术网

如何在tomcat上正常关闭ActiveMQ会话线程

如何在tomcat上正常关闭ActiveMQ会话线程,tomcat,spring-boot,jms,activemq,spring-jms,Tomcat,Spring Boot,Jms,Activemq,Spring Jms,我们如何才能优雅地关闭守护进程线程[ActiveMQ会话:ID:PC-63704-1472105244157-1:1:1] 我们有一个基于spring boot的web应用程序,它运行在tomcat 8上。并使用springjms4.2.4.RELEASE向activemq5.13.0发送/接收消息 activeMQ相关的LIB如下(所有版本均为5.13.0) 对于发送消息,我们只需自动连接JmsTemplate并发送消息: @Autowired private JmsTemplate jmsT

我们如何才能优雅地关闭守护进程线程[ActiveMQ会话:ID:PC-63704-1472105244157-1:1:1]

我们有一个基于spring boot的web应用程序,它运行在tomcat 8上。并使用
springjms4.2.4.RELEASE
向activemq5.13.0发送/接收消息

activeMQ相关的LIB如下(所有版本均为5.13.0)

对于发送消息,我们只需自动连接JmsTemplate并发送消息:

@Autowired
private JmsTemplate jmsTemplate;

MessageCreator messageCreator = new MessageCreator() {
    @Override
    public Message createMessage(Session session) throws JMSException {
        // return Message
    }
};

jmsTemplate.send(new ActiveMQTopic(destinationName), messageCreator);
对于接收(侦听)消息,我们使用Spring DefaultMessageListenerContainer(DMLC)

当我们关闭tomcat时,会出现如下警告日志

22-Aug-2016 17:23:32.870 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [demo] appears to have started a thread named [ActiveMQ Session: ID:PC-63704-1472105244157-1:1:1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:502)
org.apache.activemq.thread.DedicatedTaskRunner.runTask(DedicatedTaskRunner.java:119)
org.apache.activemq.thread.DedicatedTaskRunner$1.run(DedicatedTaskRunner.java:42)
22-Aug-2016 17:23:32.872 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [demo] appears to have started a thread named [ActiveMQ InactivityMonitor Worker] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
如果我关闭应用程序,tomcat线程堆栈将有一个守护进程线程挂在那里

org.apache.catalina.startup.Bootstrap at localhost:63675    
Thread [main] (Running) 
Daemon Thread [NioBlockingSelector.BlockPoller-1] (Running) 
Daemon Thread [NioBlockingSelector.BlockPoller-2] (Running) 
Daemon Thread [NioBlockingSelector.BlockPoller-3] (Running) 
Daemon Thread [AsyncLogger-1] (Running) 
Thread [ActiveMQ Session: ID:PC-63704-1472105244157-1:1:1] (Running)    
Daemon Thread [ContainerBackgroundProcessor[StandardEngine[Catalina]]] (Running)    
Daemon Thread [http-nio-1010-ClientPoller-0] (Running)  
Daemon Thread [http-nio-1010-ClientPoller-1] (Running)  
Daemon Thread [http-nio-1010-Acceptor-0] (Running)  
Daemon Thread [http-nio-1443-ClientPoller-0] (Running)  
Daemon Thread [http-nio-1443-ClientPoller-1] (Running)  
Daemon Thread [http-nio-1443-Acceptor-0] (Running)  
Daemon Thread [ajp-nio-8019-ClientPoller-0] (Running)   
Daemon Thread [ajp-nio-8019-ClientPoller-1] (Running)   
Daemon Thread [ajp-nio-8019-Acceptor-0] (Running)   
Daemon Thread [http-nio-1010-exec-1] (Running)  
[ActiveMQ会话:ID:PC-63704-1472105244157-1:1:1]线程的堆栈如下所示

Thread [ActiveMQ Session: ID:MoboLink-63704-1472105244157-1:1:1] (Suspended)    
waiting for: Object  (id=96)    
Object.wait(long) line: not available [native method]   
Object.wait() line: 502 
DedicatedTaskRunner.runTask() line: 119 
DedicatedTaskRunner$1.run() line: 42
我们已经在
ContextClosedEvent
中处理了
DefaultMessageListenerContainer
PooledConnectionFactory
的关闭,如下所示,但仍然有[ActiveMQ会话:ID:PC-63704-1472105244157-1:1:1]线程挂在那里

@Autowired
private DefaultMessageListenerContainer afterCreateJmsListenerContainer;
@Autowired
private PooledConnectionFactory pooledJmsConnectionFactory;

@EventListener
private void onContextClosed(ContextClosedEvent event)
{
    try
    {
        if (afterCreateJmsListenerContainer != null) {
            afterCreateJmsListenerContainer.shutdown();
        }

        if (pooledJmsConnectionFactory != null) {
            pooledJmsConnectionFactory.clear();
        }
    } catch (Exception e)
    {
        logger.error("Exception", e);
    }
}

是否还有其他设置未完成?

请参阅DefaultMessageListenerContainer中的receiveTimeout设置,如果它为-1,则侦听器线程将被阻止,直到它收到消息,否则每个超时期间它将检查使用者是否停止。默认值为1000ms。

如果在指定重试后的时间段内没有收到消息,该设置也将停止该特定侦听器,其他设置可用于控制活动侦听器的数量。见和

org.apache.catalina.startup.Bootstrap at localhost:63675    
Thread [main] (Running) 
Daemon Thread [NioBlockingSelector.BlockPoller-1] (Running) 
Daemon Thread [NioBlockingSelector.BlockPoller-2] (Running) 
Daemon Thread [NioBlockingSelector.BlockPoller-3] (Running) 
Daemon Thread [AsyncLogger-1] (Running) 
Thread [ActiveMQ Session: ID:PC-63704-1472105244157-1:1:1] (Running)    
Daemon Thread [ContainerBackgroundProcessor[StandardEngine[Catalina]]] (Running)    
Daemon Thread [http-nio-1010-ClientPoller-0] (Running)  
Daemon Thread [http-nio-1010-ClientPoller-1] (Running)  
Daemon Thread [http-nio-1010-Acceptor-0] (Running)  
Daemon Thread [http-nio-1443-ClientPoller-0] (Running)  
Daemon Thread [http-nio-1443-ClientPoller-1] (Running)  
Daemon Thread [http-nio-1443-Acceptor-0] (Running)  
Daemon Thread [ajp-nio-8019-ClientPoller-0] (Running)   
Daemon Thread [ajp-nio-8019-ClientPoller-1] (Running)   
Daemon Thread [ajp-nio-8019-Acceptor-0] (Running)   
Daemon Thread [http-nio-1010-exec-1] (Running)  
Thread [ActiveMQ Session: ID:MoboLink-63704-1472105244157-1:1:1] (Suspended)    
waiting for: Object  (id=96)    
Object.wait(long) line: not available [native method]   
Object.wait() line: 502 
DedicatedTaskRunner.runTask() line: 119 
DedicatedTaskRunner$1.run() line: 42
@Autowired
private DefaultMessageListenerContainer afterCreateJmsListenerContainer;
@Autowired
private PooledConnectionFactory pooledJmsConnectionFactory;

@EventListener
private void onContextClosed(ContextClosedEvent event)
{
    try
    {
        if (afterCreateJmsListenerContainer != null) {
            afterCreateJmsListenerContainer.shutdown();
        }

        if (pooledJmsConnectionFactory != null) {
            pooledJmsConnectionFactory.clear();
        }
    } catch (Exception e)
    {
        logger.error("Exception", e);
    }
}