背景
我需要使用java.util.concurrent.Executor
来序列化WebService中一些遗留代码的执行。
我已将一个成员变量executor添加到WebService类中。它由弹簧框架从外部注入。
执行器bean定义如下:
<bean id="riskValueEstimateUpdateExecutor" scope="singleton"
class="java.util.concurrent.Executors"
factory-method="newSingleThreadExecutor" />
问题:
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)
如何解决此问题?
如果您需要更多信息,请提出建议。
答案 0 :(得分:8)
这既不是Tomcat也不是Spring的错。您只需正确关闭ExecutorService
即可。在bean定义中添加destroy-method
:
<bean id="riskValueEstimateUpdateExecutor" scope="singleton"
class="java.util.concurrent.Executors"
factory-method="newSingleThreadExecutor" destroy-method="shutdown"/>
BTW singleton
范围是默认值。您也可以考虑使用shutdownNow()
方法。另请注意,Spring提供了强大的task scheduling机制。
答案 1 :(得分:5)
当Spring上下文关闭时,您需要找到一种方法来调用shutdown:尝试使用bean destroy-method
属性并将其设置为shutdown
。像这样:
<bean id="riskValueEstimateUpdateExecutor" scope="singleton"
class="java.util.concurrent.Executors"
factory-method="newSingleThreadExecutor" destroy-method="shutdown" />