使用java.util.concurrent.Executor会阻止tomcat停止

Ant*_*ong 7 java concurrency spring tomcat web-services

背景:

我需要使用java.util.concurrent.Executor序列化WebService中的一些遗留代码的执行.

我已经向WebService类添加了一个成员变量executor.它由弹簧框架从外部注入.

执行程序bean定义如下:

<bean id="riskValueEstimateUpdateExecutor" scope="singleton"
        class="java.util.concurrent.Executors"
        factory-method="newSingleThreadExecutor" />
Run Code Online (Sandbox Code Playgroud)
  • Tomcat版本:6.0.22
  • Java版本:1.6
  • 弹簧框架:2.5.5

问题:

WS按预期工作.我们将它推广到Linux服务器.然后我们意识到tomcat停止脚本无法再停止服务.

我使用kill -3到tomcat实例.在线程转储中,我找到以下行:

"pool-2-thread-1" prio=10 tid=0xad637c00 nid=0xf37 waiting on condition [0xae882000..0xae883020]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0xb453b710> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:358)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:946)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:906)
        at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

如果您需要更多信息,请提出建议.

Tom*_*icz 8

这既不是Tomcat也不是Spring的错.你只需要ExecutorService正确关闭.添加destroy-methodbean定义:

<bean id="riskValueEstimateUpdateExecutor" scope="singleton"
    class="java.util.concurrent.Executors"
    factory-method="newSingleThreadExecutor" destroy-method="shutdown"/>
Run Code Online (Sandbox Code Playgroud)

BTW singleton范围是默认的.您也可以考虑使用shutdownNow()方法.还要注意Spring提供了强大的任务调度机制.


Fem*_*emi 5

在Spring上下文关闭时,您需要找到一种方法来调用shutdown:尝试使用bean destroy-method属性并将其设置为shutdown.像这样的东西:

<bean id="riskValueEstimateUpdateExecutor" scope="singleton"
        class="java.util.concurrent.Executors"
        factory-method="newSingleThreadExecutor" destroy-method="shutdown" />
Run Code Online (Sandbox Code Playgroud)