`
leozam
  • 浏览: 29394 次
社区版块
存档分类
最新评论

记一次Quartz定时任务导致的系统崩溃Debug过程

 
阅读更多
公司一个Spring+Hibernate架构的后台管理项目部署到远程服务器的tomcat上,tomcat里reloadable设置为true。

某次更新,将项目class文件替换后,系统自动reload,正常运行。大概一小时后,有人反映说系统无法访问了。后台一查,tomcat已经停止服务了。

查询log日志,未见相关报错。遂找到catalina.out文件,发现系统在重启时有十来条类似如下所示的警告信息:
The web application [/project] appears to have started a thread named [SchedulerFactoryBean-Worker-1] but has faild to stop it. This is very likely to create a memory leak。大意就是某个线程在系统关闭的时候没有被停止掉,可能导致内存泄漏。

看到SchedulerFactoryBean,了解到问题应该出在Quartz定时调度上面。网上查询相关资料,得出出现此问题的原因大概是:系统在关闭时没有给Quartz时间来停止它所创建的定时任务,导致线程未被停止系统便已经关闭了。

解法如下:配置QuartzContextListener实现ServletContextListener,并在ContextDestroyed时执行SchedulerFactoryBean的shutdown方法。以下是代码:

(别忘了在web.xml里面配置上QuartzContextListener哦)

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.WebApplicationContext;

public class QuartzContextListener implements ServletContextListener{

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		WebApplicationContext webApplicationContext = (WebApplicationContext) arg0  
				.getServletContext()  
				.getAttribute(  
						WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);  
		org.quartz.impl.StdScheduler schedulerFactoryBean = (org.quartz.impl.StdScheduler) webApplicationContext  
				.getBean("schedulerFactoryBean");//配置文件里配置的quartz的beanId 
		if(schedulerFactoryBean != null) {  
			schedulerFactoryBean.shutdown();  
		}  
		try {  
			Thread.sleep(5000);//主线程暂停一定时间让quartz schedular执行shutdown  
		} catch (InterruptedException e) {  
			e.printStackTrace();  
		} 
	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		Logger logger = LoggerFactory.getLogger(getClass());
		logger.info("QuartzContextListener is initializing");
	}

}


分享到:
评论

相关推荐

    C# Quartz.Net定时任务操作明细、完整过程

    【C# Quartz.Net定时任务操作】Quartz.Net是一款强大的任务调度框架,广泛应用于C#环境下的定时任务管理。本文将详细介绍如何使用Quartz.Net进行定时任务的配置与执行。 首先,**通过Nuget安装框架**非常简单,只需...

    Quartz定时任务表达式

    Quartz是一个开源的作业调度框架,能够触发在指定时间运行的任务,广泛应用于Java应用程序中进行定时任务的管理。Quartz的核心是Cron表达式,它允许开发者以一种灵活且可读性高的方式定义任务的执行时间。 #### ...

    Quartz定时任务图形界面的系统

    Quartz定时任务图形界面系统是一种基于Java开发的高级任务调度平台,它允许开发者安排和管理应用程序中的各种任务执行。在本系统中,Quartz与其他流行的技术框架如SpringMVC、MyBatis、Thymeleaf和Bootstrap3进行了...

    java quartz 定时任务

    Java Quartz 是一个强大的开源任务调度库,用于在Java应用程序中创建和管理定时任务。Quartz 提供了丰富的API,使得开发者能够灵活地定义任务,并精确控制任务的执行时间。本项目利用Quartz 实现了基于Cron表达式的...

    Spring + quartz 定时任务修改定时时间不重启服务

    Spring + quartz 定时任务修改定时时间不重启服务

    C# 控制台Quartz定时任务.doc

    【Quartz定时任务】是Java领域的一个强大任务调度框架,但在C#中也有相应的实现,如标题所示,这里讨论的是C#控制台应用中使用Quartz.NET进行定时任务的实现。Quartz.NET允许开发者在应用程序中安排任务在特定时间...

    quartz定时任务使用例子大全

    quartz定时任务使用例子大全,这里面介绍了三种使用quartz定时任务的方式,第一种方式是完全使用代码写死的调用方式,第二种使用的是从数据库读取任务配置信息的调用方式,第三种是使用从数据库读取任务配置,生成...

    Quartz定时任务框架

    Quartz是一款开源的作业调度框架,它为Java应用程序提供了强大的定时任务管理能力。作为一个专业的IT行业大师,我将深入解析Quartz的核心概念、工作原理以及如何实现简单的定时任务。 Quartz的主要功能在于允许...

    定时任务quartz实现分组串行并行动态配置

    Quartz是一款广泛使用的开源作业调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在实际应用中,我们可能需要根据业务需求动态地配置定时任务的执行方式,例如,某些任务可能需要串行执行,而其他任务则...

    springboot整合quartz定时任务yml文件配置方式

    在Spring Boot应用中整合Quartz定时任务是一种常见的需求,它可以帮助我们执行周期性的后台任务,如数据同步、报表生成等。Spring Boot与Quartz的结合提供了便捷的配置方式,特别是通过YAML(YAML Ain't Markup ...

    spring3配置quartz定时任务

    总结,通过以上步骤,我们就成功地在Spring 3中配置了Quartz定时任务,实现了每10秒执行一次的任务。在实际应用中,你可以根据需求定义更复杂的作业和触发器,以及使用Quartz的其他高级特性,如集群支持、持久化作业...

    Quartz定时任务简单列子

    Quartz是一款开源的作业调度框架,它允许在Java应用程序中创建和管理定时任务。这个"Quartz定时任务简单列子"可能是一个简单的教程或者示例项目,用于展示如何在Java应用中集成和使用Quartz来执行预定的任务。 ...

    Quartz 定时任务web使用

    通过上述内容,我们可以构建一个基于Quartz的Web应用定时任务系统,实现任务的自动执行。对于"Quartz_demo"这个压缩包文件,可能包含了示例代码、配置文件和说明文档,可以进一步帮助学习和实践Quartz在Web环境中的...

    Quartz定时任务

    Quartz.Net是一个定时任务框架,可以实现异常灵活的定时任务,开发人员只要编写少量的代码就可以实现“每隔1小时执行”、“每天22点执行”、“每月18日的下午执行8次”等各种定时任务。 Quartz.Net中的概念:计划者...

    quartZ定时任务.zip

    Quartz是一款开源的作业调度框架,它允许程序在指定的时间执行特定的任务,广泛应用于Java企业级应用中。SpringBoot与Quartz的集成使得在微服务环境中实现定时任务变得非常便捷。下面将详细介绍如何利用Quartz在...

    C#Quartz定时任务

    【C# Quartz定时任务】是基于C#编程语言实现的一种定时任务框架,它允许开发者在.NET环境中创建和管理定时任务。这个项目是在Visual Studio 2010开发环境下编写的,提供了一个可以直接运行的示例(demo),方便快速...

    Quartz定时任务常用的11张数据库脚本表结构

    Quartz是一款广泛使用的开源任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在Quartz中,任务和触发器的配置信息是通过数据库存储的,这使得任务调度具有高可用性和可扩展性。这里我们将详细探讨...

    spring整合quartz定时任务调度

    在IT行业中,定时任务调度是应用系统中常见且重要的功能之一,它允许程序在特定时间执行特定的任务。Spring框架作为Java领域广泛使用的轻量级框架,提供了与第三方库Quartz的整合,使得开发者能够轻松地在Spring应用...

    Quartz.net作业调度自定义定时执行任务多任务执行c#

    Quartz.NET是一个强大的开源作业调度框架,用于在.NET环境中创建和执行定时任务。它提供了高度灵活的调度功能,使得开发者可以轻松地定义和控制任务的执行时间。在"Quartz.net作业调度自定义定时执行任务多任务执行...

    springboot+quartz 动态化配置定时任务

    在IT行业中,定时任务是许多系统不可或缺的一部分,用于执行周期性的后台作业,如数据同步、报表生成、清理过期数据等。SpringBoot结合Quartz框架,可以实现灵活且高效的定时任务管理。本教程将深入探讨如何在...

Global site tag (gtag.js) - Google Analytics