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

标签 java web-services spring tomcat concurrency

背景:

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

我在 WebService 类中添加了一个成员变量 executor。它由 springframework 从外部注入(inject)。

执行器 bean 定义如下:

<bean id="riskValueEstimateUpdateExecutor" scope="singleton"
        class="java.util.concurrent.Executors"
        factory-method="newSingleThreadExecutor" />
  • Tomcat版本:6.0.22
  • Java 版本:1.6
  • Spring 框架:2.5.5

问题:

WS 按预期工作。我们将它推出到 Linux 服务器上。然后我们意识到tomcat停止脚本不能再停止服务。

我对 tomcat 实例使用 kill -3。在线程转储中,我找到了这些行:

"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)

我该如何解决这个问题?

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

最佳答案

这既不是 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机制。

关于java - 使用 java.util.concurrent.Executor 阻止 tomcat 停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7427132/

相关文章:

java - 错误 :org. postgresql.util.PSQLException :ERROR: column userinfo0_. dtype 不存在

java - 如何在 HTML 中嵌入 jar

java - 如何传入/使用.Class/Object作为方法参数

java - Android .setmesage 带有下标或上标文本

java - 定义 Web 服务接口(interface)(继承/重载)的最佳/标准方法是什么?

c# - 是否使用Web服务或HttpHandler来提供图像?

java - 我想在 SOAP 体元素中传递我的自定义对象,该怎么做?

java - 如何检查maven使用哪个配置进行测试?

java - 是否可以从 REST 请求中获取 POST 参数?

java - 双向 Web 服务通信 REST