【问题标题】:ThreadPoolExecutor getting shutdown automatically after few hour later of server startThreadPoolExecutor 在服务器启动几个小时后自动关闭
【发布时间】:2018-08-03 11:56:27
【问题描述】:

我创建了一个 ThreadPoolExecuter,corePool 大小 = 10,最大池大小 = 50,工作队列 = 100,在本地机器上一切正常,但在开发服务器(Linux 机器)上,线程池活动了几个小时然后自动关机。

所以在那之后所有的新任务都被拒绝了。

我们分配给这个线程池的任务有 25 秒的超时时间。

我们也有多个线程池,但是当我们关闭服务器时它们会关闭。

private static ArrayBlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(100);

ThreadFactory threadFactory = getNamedTreadFactory(false, "Thread-01");

xecutorService es = new ThreadPoolExecutor(10, 50, 3, TimeUnit.SECONDS, workQueue, threadFactory, handler);

【问题讨论】:

  • ThreadPoolExecutor 不会自动关闭,只有调用 shutdownshutdownNow 方法之一才能导致它。你确定那些在你的代码中没有被调用吗?
  • 谢谢@AlexandreDupriez!我得到了这个问题。在项目中的某个地方,我们调用了 shutdownnow 方法。并且这条线出现在 ServletContextListener 实现类中所以每当我们在开发服务器上推送一些代码时,Web 应用程序上下文都会重新创建,而在上下文销毁时,它会调用覆盖的 contextDestroyed(ServletContextEvent arg),然后调用 showdownnow 方法。 public void contextDestroyed(ServletContextEvent arg) { //这里存在池关闭代码 - 所以我们将其删除 } 再次感谢。问题已解决。
  • 太好了 - 很高兴你找到了有罪的电话。

标签: multithreading threadpool java.util.concurrent threadpoolexecutor


【解决方案1】:

这个问题背后的原因是我们有监听上下文活动的 ServletContextListner 实现。因此,当 DEV 服务器上的代码被推送时,应用程序正在热部署并且应用程序上下文正在重新创建,这一次它正在关闭池。

public class ApplicationContextListner implements ServletContextListener{

@Override
public void contextDestroyed(ServletContextEvent arg0) {
    //Here the pool shutdown code was present - so we removed it 
}}

从销毁方法中删除池关闭调用后。它起作用了。

问题已解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 2019-09-01
    • 2020-10-05
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多