`
laowang1984
  • 浏览: 17202 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类
最新评论

spring和quartz的集成

 
阅读更多

一直以来都认为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包 不需要6个

    但正如描述中指出的,对于基本的Spring和Quartz集成,只需要上述4个核心jar包即可。 为了在项目中集成Spring和Quartz,你需要将这些jar添加到项目的类路径中。如果你使用的是Maven或Gradle,可以将它们添加为依赖。...

    spring+quartz demo

    Spring 提供了与 Quartz 集成的模块,使得在 Spring 应用程序中使用 Quartz 更加便捷,包括 Job 实例的管理、触发器的配置以及对 Quartz Scheduler 的控制。 在这个 "spring+quartz demo" 中,我们可以学习到如何将...

    spring整合quartz的简单成功案例

    这个项目包含了一个配置良好的Spring和Quartz集成,确保用户只需导入并启动服务器,即可自动运行预定的任务。 首先,要整合Spring和Quartz,我们需要在Spring的配置文件(如`applicationContext.xml`)中引入Quartz...

    spring集成quartz所需文件

    这些资源可以帮助开发者理解如何进行实际的集成操作,例如提供已配置好的 Spring 和 Quartz 示例,展示如何定义 Job 和 Trigger,以及如何在 Spring 中管理和控制它们。 总的来说,Spring 和 Quartz 的集成是一项...

    spring2与quartz在Web整合

    Spring 2 和 Quartz 是两个在 Java Web 开发中非常重要的框架。Spring 是一个全面的开源应用框架,提供了依赖注入(DI)、面向切面编程(AOP)以及丰富的数据访问和事务管理功能。Quartz,则是一个功能强大的作业...

    spring集成quartz集群配置

    首先,理解Spring集成Quartz的核心在于Spring的Job接口和Quartz的Scheduler。Spring提供了`org.springframework.scheduling.quartz.JobDetailBean`来创建Job,`org.springframework.scheduling.quartz....

    quartz和spring-quartz

    Quartz和Spring-Quartz是两个在Java世界中广泛使用的定时任务管理框架。Quartz是一个开源的作业调度框架,允许应用程序定义和调度任务在特定时间执行。而Spring-Quartz则是Spring框架对Quartz的集成,它使得在Spring...

    spring 集成quartz 用数据库实现quartz的集群

    在企业级应用中,定时任务的管理是必不可少的一部分,Spring框架提供了与Quartz的集成,使得我们可以方便地创建和管理定时任务。Quartz是一款强大的、开放源代码的作业调度框架,它可以灵活地安排和执行任务。而当...

    Java_Spring与Quartz的整合

    在Java Spring中整合Quartz,可以利用Spring的管理能力来控制Quartz的作业和触发器,使得整个系统更加灵活和易于维护。以下将详细介绍如何进行Spring与Quartz的整合。 1. **集成步骤** - 添加依赖:首先,确保在...

    Spring Quartz集成

    总结来说,Spring Quartz集成提供了在Spring环境中便捷地管理和调度定时任务的能力,通过配置文件可以实现任务的静态定义,而在需要动态调整时,可以通过自定义扩展来实现更复杂的需求。理解这些核心概念和机制,...

    关于spring中quartz的配置

    在Spring框架中集成Quartz是一款常见的任务调度解决方案,它允许开发者在应用中安排定时任务的执行。Quartz是一个开源的作业调度框架,可以用来在Java应用程序中安排复杂的作业任务。以下将详细介绍如何在Spring中...

    Spring+quartz相关jar包.rar

    在"Spring+quartz相关jar包.rar"这个压缩文件中,可能包含了这些必要的 jar 包,以便于开发者在自己的项目中集成 Spring 和 Quartz。通过下载并导入这些 jar 包,开发者可以快速搭建一个能够进行定时任务调度的系统...

    spring+quartz使用jar包

    1. **Spring与Quartz的整合**:Spring 提供了对Quartz的集成支持,通过`org.springframework.scheduling.quartz`包中的类,如`SchedulerFactoryBean`和`ThreadPoolTaskExecutor`,可以轻松地将Quartz纳入Spring的...

    spring和quartz的定时器的启动和停止例子

    Spring提供了一种集成Quartz的方式,使得我们可以方便地在Spring应用中管理和执行定时任务。本篇将深入探讨如何在Spring中启动和停止Quartz定时器。 首先,我们需要理解Spring和Quartz的基本概念。Spring是一个强大...

    Spring_QuartZDemo

    【Spring_QuartZDemo】是一个使用Spring框架集成Quartz定时任务的示例项目,它展示了如何在Java应用中利用Spring和Quartz实现任务调度。Quartz是Java领域一款功能强大的开源作业调度库,能够帮助开发者创建、调度和...

    springquartz

    由于未提供具体的博客内容,以上都是基于常见Spring和Quartz集成场景的通用知识点概述。要深入学习,建议直接访问给出的博客链接获取详细信息和示例代码。同时,标签中的“源码”提示我们可能会涉及到一些Quartz和...

    Spring quartz

    文件列表中,`spring quartz.doc` 可能是关于如何集成 Spring 和 Quartz 的文档,可能包含详细的步骤、示例代码和最佳实践。`spring-2.0.6.jar` 是 Spring 框架的一个较旧版本的 JAR 文件,它包含了 Spring 框架的...

    Spring+Quartz2

    Spring 和 Quartz2 是两个在 Java 开发中广泛使用的框架,它们在企业级应用中承担着重要的角色。Spring 是一个全面的、开源的应用框架,而 Quartz2 是一个强大的、开源的作业调度库,常用于实现定时任务。下面我们将...

    Spring与QuartZ集成定时器

    【Spring与QuartZ集成定时器】是一种在Java应用程序中实现定时任务的常见方式,它结合了Spring框架的灵活性和Quartz的定时功能。Quartz是一个开源的作业调度框架,可以用于创建、调度和执行重复性的任务。Spring则...

    spring的quartz使用实例

    Quartz是一个开源的作业调度框架,而Spring通过提供一个简洁的API使得与Quartz的集成变得简单。以下是对Spring整合Quartz使用实例的详细说明: 1. **Quartz简介** Quartz是一个强大的、完全开源的作业调度框架,它...

Global site tag (gtag.js) - Google Analytics