zoukankan      html  css  js  c++  java
  • 解决linux下tomcat停止进程任存在问题

    解决linux下tomcat停止进程任存在问题

    在Linux下(之所以强调linux下,是因为在windows下正常),执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访问,但是ps -ef |grep tomcat 后,发现tomcat对应的java进程未随web容器关闭而销毁,进而存在僵尸java进程。多次shutdown以后会发现系统内存溢出,然后需要一个一个把tomcat的进程杀掉

    问题原因

    在Linux系统中当有非守护线程(即User Thread)存在,jvm不会退出(当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则JVM不会退出)。

    在本人项目中是因为使用了ScheduledExecutorService建立了一个定时任务,(executorService会为之维护一个定时服务的线程池,在web容器中建立的线程的生命周期并不会和Web应用程序保持同步,该线程池并不会随着web容器关闭而销毁),因此在tomcat停止的时候没有将这个定时任务线程不会停止。

    问题解决

    ScheduledExecutorService有一个shutdownNow()方法,只需要在系统停止时调用这个方法将定时任务停掉即可。

    另外

    Spring为JDK Timer和Quartz Scheduler所提供的TimerFactoryBean和SchedulerFactoryBean能够和Spring容器的生命周期关联,在 Spring容器启动时启动调度器,而在Spring容器关闭时,停止调度器。所以在Spring中通过这两个FactoryBean配置调度器,再从 Spring IoC中获取调度器引用进行任务调度将不会出现这种Web容器关闭而任务依然运行的问题。

  • 相关阅读:
    activiti并行和串行区别
    SpringMVC 封装返回结果对象
    maven基础
    activiti表
    SpringBoot进阶
    SpringBoot基础
    javascript ES6模块化
    Vuejs搜索下拉框
    Vuejs2.0 + bootstrap demo
    maven settings.xml
  • 原文地址:https://www.cnblogs.com/wwyz/p/6641724.html
Copyright © 2011-2022 走看看