Spring的Tomcat服务关闭后,Quartz进程无法正常关闭,出现内存泄露 2022-04-04 10:51 607阅读 0赞 ### 简介 ### * spring内部整合quartz,将quartz整合到web项目里面,通过页面动态控制quartz的增加、修改、删除、查询,这种方式极大简化了对quartz定时器任务的控制; * 但随之而来的是一个极为困扰的问题:当项目的服务器关闭的时候,quartz定时器任务进程依旧在运行,如果不手动去kill掉进程,这个定时任务会一直残留,导致下次再重启服务器的时候,又重复启动定时器,导致多个重复的定时任务在运行; * 问题展现: warnning: The web application [xxxxx] appears to have started a thread named [DefaultQuartzScheduler_Worker-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Object.wait(Native Method) org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568) ### 解决方案 ### * 使用监听器关闭quartz的定时器进程; * 在尝试网上多种解决方案无果之后,从中找到了一些灵感,在关闭tomcat的时候,触发监听器,调用方法获取当前进程的所有quartz定时器线程,然后强制执行shutdown方法,删除所有quartz线程,虽然非最佳方案,但确实解决了我所头疼的定时器无法在服务器关闭的时候自动关闭的问题; * 网友解决方案相关链接: 1. [https://blog.csdn.net/only09080229/article/details/42172251][https_blog.csdn.net_only09080229_article_details_42172251] 2. [https://www.cnblogs.com/passedbylove/p/7580477.html][https_www.cnblogs.com_passedbylove_p_7580477.html] 3. [https://www.linuxidc.com/Linux/2015-06/119042.htm][https_www.linuxidc.com_Linux_2015-06_119042.htm] 4. [https://blog.csdn.net/dslztx/article/details/47276953][https_blog.csdn.net_dslztx_article_details_47276953] 5. [https://blog.csdn.net/liujun\_for\_java/article/details/78101478?utm\_source=blogxgwz5][https_blog.csdn.net_liujun_for_java_article_details_78101478_utm_source_blogxgwz5] ### 代码实践 ### * 首先在web.xml添加监听器的类映射(如果项目的webapp版本是3.0以上的话可以直接在类上添加@WebListener即可): <listener> <listener-class>com.sixmonth.common.listener.AppContextListener</listener-class> </listener> * 创建监听器java类: package com.sixmonth.common.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; import org.springframework.stereotype.Component; /** * tomcat开启以及关闭的监听器 * @author hqc * @Date: 2018年12月13日 * */ @Component public class AppContextListener implements ServletContextListener{ /** * tomcat启动初始化 */ @Override public void contextInitialized(ServletContextEvent event) { System.out.println("tomcat已经启动!"); } /** * tomcat关闭 */ @Override public void contextDestroyed(ServletContextEvent event) { System.out.println("tomcat已经关闭!开始关闭quartz!"); try { SchedulerFactory sf = new StdSchedulerFactory();//创建新的调度器工厂 Scheduler scheduler = null; //Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler = sf.getScheduler();//获取当前进程的所有定时器线程数据 scheduler.shutdown(false);//关闭定时器线程 System.out.println("关闭定时器线程成功!"); } catch (Exception e) { System.out.println("关闭定时器线程失败!"); e.printStackTrace(); } } } ### 结语 ### 网上解决此类问题的方法有很多种,有兴趣的程序员可深入了解,如果有更有效的方法欢迎和小编交流,不胜感激~ [https_blog.csdn.net_only09080229_article_details_42172251]: https://blog.csdn.net/only09080229/article/details/42172251%EF%BC%9B [https_www.cnblogs.com_passedbylove_p_7580477.html]: https://www.cnblogs.com/passedbylove/p/7580477.html [https_www.linuxidc.com_Linux_2015-06_119042.htm]: https://www.linuxidc.com/Linux/2015-06/119042.htm [https_blog.csdn.net_dslztx_article_details_47276953]: https://blog.csdn.net/dslztx/article/details/47276953 [https_blog.csdn.net_liujun_for_java_article_details_78101478_utm_source_blogxgwz5]: https://blog.csdn.net/liujun_for_java/article/details/78101478?utm_source=blogxgwz5 文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。
相关 Linux下Tomcat的启动、关闭、杀死进程 打开终端执行 bin/startup.sh \启动tomcat bin/shutdown.sh \停止tomcat tail -f logs/catalina.ou 小鱼儿/ 2021年11月04日 21:04/ 0 赞/ 219 阅读
相关 Linux关闭Tomcat服务器出现无法关闭 :8005端口未启动 QUESTION:Linux关闭Tomcat服务器出现无法关闭 :8005端口未启动 ANSWER: 修改$JAVA\_HOME/jre/lib/security/ 忘是亡心i/ 2021年12月14日 20:49/ 0 赞/ 77 阅读
相关 Spring整合quartz关闭,关闭Tomcat Servlet容器时内存泄漏 先码下 [https://www.cnblogs.com/passedbylove/p/7580477.html][https_www.cnblogs.com_passed ﹏ヽ暗。殇╰゛Y/ 2022年01月22日 20:13/ 0 赞/ 66 阅读
相关 Spring的Tomcat服务关闭后,Quartz进程无法正常关闭,出现内存泄露 简介 spring内部整合quartz,将quartz整合到web项目里面,通过页面动态控制quartz的增加、修改、删除、查询,这种方式极大简化了对quartz定 ╰半橙微兮°/ 2022年04月04日 10:51/ 0 赞/ 608 阅读
相关 Quartz关闭超时订单 订单服务 用户下单之后会占用库存 如果,用户不处理订单,需要系统自动关闭已经下单的订单 比如,秒杀的时候,设置的时间可能非常短 下单之后,需要用户马上付款,否则 蔚落/ 2022年05月16日 20:47/ 0 赞/ 31 阅读
相关 Tomcat-----执行tomcat的shutdown.sh后关闭不了java进程 ![70][] [70]: /images/20220519/f8a622246b8c4acfa834b80598d135fe.png た 入场券/ 2022年05月19日 22:13/ 0 赞/ 44 阅读
相关 Tomcat无法正常关闭 正常Tomcat开启关闭是使用bin文件夹下的 start.sh和shutdown.sh脚本进行。最近项目中部署无法正常关闭,每次都需要用kill命令关。不太正 迷南。/ 2022年06月01日 14:27/ 0 赞/ 132 阅读
相关 Linux下Tomcat的启动、关闭、杀死进程 打开终端 cd /Java/tomcat 执行 bin/startup.sh \启动tomcat bin/shutdown.sh \停止tomcat tai 川长思鸟来/ 2022年06月17日 20:53/ 0 赞/ 83 阅读
相关 linux下shutdown无法关闭tomcat进程的解决方案 1.问题 笔者在linux下发现使用tomcat6.0.41自带的./shutdown.sh经常无法停止进程,导致各种问题的发生, 令笔者相当反感! 2.解 柔情只为你懂/ 2022年08月20日 17:26/ 0 赞/ 33 阅读
相关 java关闭服务_Java开启/关闭tomcat服务器的方法 1.项目结构 ![a8e70771e57721900d9def9a0894151d.png][] 2.CallTomcat.java package com.callto 川长思鸟来/ 2022年11月06日 21:56/ 0 赞/ 43 阅读
还没有评论,来说两句吧...