一直以来都认为spring对quartz的支持不是特别合理,每一个定时任务需要配置多达三个bean,一个targetObject,一个Jobdetail,一个trigger。今天自己实现了一个简单的spring对quartz的支持,一个任务只需要配置一个spring bean即可,bean仅有一个必要属性,cronExpression(触发条件表达式)。
先贴出核心类
package com.crunii.emall.quartz; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.quartz.Job; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.beans.factory.BeanNameAware; public abstract class QuartzJob extends JobDetail implements Job, BeanNameAware { private String beanName; public void execute(JobExecutionContext jobexecutioncontext) throws JobExecutionException { run(); } private String cronExpression; protected Log log = LogFactory.getLog(this.getClass()); public String getCronExpression() { return cronExpression; } public void setCronExpression(String cronExpression) { this.cronExpression = cronExpression; } public abstract void run(); public void setBeanName(String beanName) { super.setGroup(beanName); super.setName(beanName); super.setJobClass(this.getClass()); this.beanName = beanName; } /** * @see java.lang.Object#toString() */ public String toString() { return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("cronExpression", this.cronExpression) .toString(); } public String getBeanName() { return beanName; } }
每一个需要定时执行的任务都要继承这个类,run方法里面是具体的业务代码
package com.crunii.emall.quartz; import org.quartz.Job; import org.quartz.JobDetail; import org.quartz.SchedulerException; import org.quartz.simpl.SimpleJobFactory; import org.quartz.spi.TriggerFiredBundle; public class SpringBeanJobFactory extends SimpleJobFactory { @SuppressWarnings("unchecked") public Job newJob(TriggerFiredBundle triggerfiredbundle) throws SchedulerException { JobDetail jobDetail = triggerfiredbundle.getJobDetail(); if (jobDetail instanceof QuartzJob && jobDetail instanceof Job) { return (Job) jobDetail; } else { return super.newJob(triggerfiredbundle); } } }
这个东西困扰了我很久,quartz在定制任务的时候,默认是自动把jobdetail里面的class做newinstance,个人觉得这个做法不太合理,应该开放一个api来实现可以放入具体的Object,而不是class。因为有的时候我需要自己来生成需要执行的object,比如在和spring集成的时候,我就需要将spring里面的bean直接放入到quartz工厂,而quartz显然不支持这个做法。
下面从spring工厂里面取得需要定时执行的object,放入到quartz工厂
try { SchedulerFactory schedFact = new StdSchedulerFactory(); sched = schedFact.getScheduler(); // 这里需要重写jobfactory,不然springbean放入进去之后,所有spring注入的属性都不能用,nullpointer SpringBeanJobFactory jobfactory = new SpringBeanJobFactory(); sched.setJobFactory(jobfactory); sched.start(); Map<String, QuartzJob> quartzTasks = context.getBeansOfType(QuartzJob.class); for (QuartzJob quartzJob : quartzTasks.values()) { String beanName = quartzJob.getBeanName(); CronTrigger trigger = new CronTrigger(beanName, beanName); try { trigger.setCronExpression(quartzJob.getCronExpression()); } catch (ParseException e) { e.printStackTrace(); } sched.scheduleJob(quartzJob, trigger); } } catch (SchedulerException e) { e.printStackTrace(); }
最后还是贴一下具体的用法吧
这里我没有引入其他的bean,不过显然上面的SpringBeanJobFactory已经实现了这个功能了。
<bean id="quartzBeanTest" class="com.crunii.emall.task.service.quartz.QuartzBeanTest"> <property name="cronExpression" value="0/10 * * * * ? "></property> </bean>
package com.crunii.emall.task.service.quartz; import com.crunii.emall.quartz.QuartzJob; public class QuartzBeanTest extends QuartzJob{ @Override public void run() { log.info("test"); } }
相关推荐
但正如描述中指出的,对于基本的Spring和Quartz集成,只需要上述4个核心jar包即可。 为了在项目中集成Spring和Quartz,你需要将这些jar添加到项目的类路径中。如果你使用的是Maven或Gradle,可以将它们添加为依赖。...
Spring 提供了与 Quartz 集成的模块,使得在 Spring 应用程序中使用 Quartz 更加便捷,包括 Job 实例的管理、触发器的配置以及对 Quartz Scheduler 的控制。 在这个 "spring+quartz demo" 中,我们可以学习到如何将...
这个项目包含了一个配置良好的Spring和Quartz集成,确保用户只需导入并启动服务器,即可自动运行预定的任务。 首先,要整合Spring和Quartz,我们需要在Spring的配置文件(如`applicationContext.xml`)中引入Quartz...
这些资源可以帮助开发者理解如何进行实际的集成操作,例如提供已配置好的 Spring 和 Quartz 示例,展示如何定义 Job 和 Trigger,以及如何在 Spring 中管理和控制它们。 总的来说,Spring 和 Quartz 的集成是一项...
Spring 2 和 Quartz 是两个在 Java Web 开发中非常重要的框架。Spring 是一个全面的开源应用框架,提供了依赖注入(DI)、面向切面编程(AOP)以及丰富的数据访问和事务管理功能。Quartz,则是一个功能强大的作业...
首先,理解Spring集成Quartz的核心在于Spring的Job接口和Quartz的Scheduler。Spring提供了`org.springframework.scheduling.quartz.JobDetailBean`来创建Job,`org.springframework.scheduling.quartz....
Quartz和Spring-Quartz是两个在Java世界中广泛使用的定时任务管理框架。Quartz是一个开源的作业调度框架,允许应用程序定义和调度任务在特定时间执行。而Spring-Quartz则是Spring框架对Quartz的集成,它使得在Spring...
在企业级应用中,定时任务的管理是必不可少的一部分,Spring框架提供了与Quartz的集成,使得我们可以方便地创建和管理定时任务。Quartz是一款强大的、开放源代码的作业调度框架,它可以灵活地安排和执行任务。而当...
在Java Spring中整合Quartz,可以利用Spring的管理能力来控制Quartz的作业和触发器,使得整个系统更加灵活和易于维护。以下将详细介绍如何进行Spring与Quartz的整合。 1. **集成步骤** - 添加依赖:首先,确保在...
总结来说,Spring Quartz集成提供了在Spring环境中便捷地管理和调度定时任务的能力,通过配置文件可以实现任务的静态定义,而在需要动态调整时,可以通过自定义扩展来实现更复杂的需求。理解这些核心概念和机制,...
在Spring框架中集成Quartz是一款常见的任务调度解决方案,它允许开发者在应用中安排定时任务的执行。Quartz是一个开源的作业调度框架,可以用来在Java应用程序中安排复杂的作业任务。以下将详细介绍如何在Spring中...
在"Spring+quartz相关jar包.rar"这个压缩文件中,可能包含了这些必要的 jar 包,以便于开发者在自己的项目中集成 Spring 和 Quartz。通过下载并导入这些 jar 包,开发者可以快速搭建一个能够进行定时任务调度的系统...
1. **Spring与Quartz的整合**:Spring 提供了对Quartz的集成支持,通过`org.springframework.scheduling.quartz`包中的类,如`SchedulerFactoryBean`和`ThreadPoolTaskExecutor`,可以轻松地将Quartz纳入Spring的...
Spring提供了一种集成Quartz的方式,使得我们可以方便地在Spring应用中管理和执行定时任务。本篇将深入探讨如何在Spring中启动和停止Quartz定时器。 首先,我们需要理解Spring和Quartz的基本概念。Spring是一个强大...
【Spring_QuartZDemo】是一个使用Spring框架集成Quartz定时任务的示例项目,它展示了如何在Java应用中利用Spring和Quartz实现任务调度。Quartz是Java领域一款功能强大的开源作业调度库,能够帮助开发者创建、调度和...
由于未提供具体的博客内容,以上都是基于常见Spring和Quartz集成场景的通用知识点概述。要深入学习,建议直接访问给出的博客链接获取详细信息和示例代码。同时,标签中的“源码”提示我们可能会涉及到一些Quartz和...
文件列表中,`spring quartz.doc` 可能是关于如何集成 Spring 和 Quartz 的文档,可能包含详细的步骤、示例代码和最佳实践。`spring-2.0.6.jar` 是 Spring 框架的一个较旧版本的 JAR 文件,它包含了 Spring 框架的...
Spring 和 Quartz2 是两个在 Java 开发中广泛使用的框架,它们在企业级应用中承担着重要的角色。Spring 是一个全面的、开源的应用框架,而 Quartz2 是一个强大的、开源的作业调度库,常用于实现定时任务。下面我们将...
【Spring与QuartZ集成定时器】是一种在Java应用程序中实现定时任务的常见方式,它结合了Spring框架的灵活性和Quartz的定时功能。Quartz是一个开源的作业调度框架,可以用于创建、调度和执行重复性的任务。Spring则...
Quartz是一个开源的作业调度框架,而Spring通过提供一个简洁的API使得与Quartz的集成变得简单。以下是对Spring整合Quartz使用实例的详细说明: 1. **Quartz简介** Quartz是一个强大的、完全开源的作业调度框架,它...