`
learnworld
  • 浏览: 169602 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

spring任务调度方法之Quartz

阅读更多
一、Quartz简介

    Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等。Spring对Quartz的集成与其对JDK Timer的集成在任务、触发器和调度计划的声明式配置方面等都非常相似。

    Quartz的核心由两个接口和两个类组成:Job和Scheduler接口,JobDetail和Trigger类。不同于JDK Timer,任务不是从实现一个Job接口的类实例开始运行,实际上Quartz在需要的时候才创建job类实例。可以使用JobDetail类来包装任务状态,并传递一个信息给Job,或在一个Job的多次执行过程之间保存信息。

二、Quartz任务调度

1. 简单任务调度

    在Quartz中创建一个任务并执行,只需要实现Job接口类,在其execute()方法中处理你的业务逻辑。下面举例说明。

HelloWorldJob.java
package com.learnworld.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloWorldJob implements Job {

	public void execute(JobExecutionContext context) throws JobExecutionException {
                  //实现你的业务逻辑
		System.out.println("Hello!");
		
	}
}


HelloScheduling.java
package com.learnworld.quartz;

import java.util.Date;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduling {
	public static void main(String[] args) throws Exception {

		Scheduler scheduler = new StdSchedulerFactory().getScheduler();
		scheduler.start();

		JobDetail jobDetail = new JobDetail("helloWorldJob",
				Scheduler.DEFAULT_GROUP, HelloWorldJob.class);

		Trigger trigger = new SimpleTrigger("simpleTrigger",
				Scheduler.DEFAULT_GROUP, new Date(), null,
				SimpleTrigger.REPEAT_INDEFINITELY, 1000);
		
		scheduler.scheduleJob(jobDetail, trigger);

	}
}


需要说明几点:

    1)开始使用StdSchedulerFactory来获取Scheduler的实例。每一个scheduler可以被启动(start)、中止(stop)和暂停(pause)。如果一个scheduler没有被启动或已经被暂停,则没有触发器会被启用,所以首先使用start()方法启动scheduler。

    2)创建JobDetail实例。它的构造参数有三个,第一个是任务名,任务名可以被用作参数来应用需要暂停的任务;第二个是组名,组名可以用来引用一组被集合在一起的任务,这里采用缺省组名,每一个任务名在组内必须是唯一的;第三个参数是实现了特定任务的类。

    3)创建Trigger实例。我们使用SimpleTrigger类,它提供了类似JDK Timer风格的触发器行为。它的构造参数有六个,第一个和第二个为触发器名和组名,和上面类似;第三个为任务开始时间;第四个为结束时间,如果设置为空,表示不存在结束时间;第五个为重复次数,允许你指的触发器被触发的最大次数,使用REPEAT_INDEFINITELY允许触发器可以被触发无限次;第六个是触发器运行的时间间隔,是毫秒数。

    4)最后通过scheduler.scheduleJob()方法调度任务。

2. 使用JobDetail传递数据

    每个JobDetail实例都有关联的JobDataMap实例,它实现了Map接口并允许通过键值来传递任务相关的数据。任务也可以修改JobDataMap中的数据,在同一任务的多次执行之间传递数据。下面举例说明。

MessageJob.java
package com.learnworld.quartz;

import java.util.Map;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MessageJob implements Job {

	public void execute(JobExecutionContext context) throws JobExecutionException {
		
		Map properties = context.getJobDetail().getJobDataMap();
		
		System.out.println("Previous Fire Time: " + context.getPreviousFireTime());
		System.out.println("Current Fire Time: " + context.getFireTime());
		System.out.println("Next Fire Time: " + context.getNextFireTime());
		System.out.println(properties.get("message"));
		
	}
}


MessageScheduling.java
package com.learnworld.quartz;

import java.util.Date;
import java.util.Map;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

public class MessageScheduling {
	public static void main(String[] args) throws Exception {

		Scheduler scheduler = new StdSchedulerFactory().getScheduler();
		scheduler.start();

		JobDetail jobDetail = new JobDetail("messageJob",
				Scheduler.DEFAULT_GROUP, MessageJob.class);
		
		Map map = jobDetail.getJobDataMap();
		map.put("message", "This is a message from Quartz");

		Trigger trigger = new SimpleTrigger("simpleTrigger",
				Scheduler.DEFAULT_GROUP, new Date(), new Date("Sat, 12 Aug 2011 13:30:00 GMT+0430"),
				SimpleTrigger.REPEAT_INDEFINITELY, 5000);
		
		scheduler.scheduleJob(jobDetail, trigger);

	}
}


3. 使用CronTrigger

   上面提到了SimpleTrigger类,它提供了类似JDK Timer风格的触发器功能。Quartz的出色在于它使用CronTrigger提供了对复杂触发器的支持。

    一个CronTrigger表达式,包含六个必须组件和一个可选组件。关于cron表达式,可以参考这篇文档:http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html

   下面举例说明CronTrigger的使用。

CronWithCalendarScheduling.java
package com.learnworld.quartz;

import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.HolidayCalendar;

public class CronWithCalendarScheduling {
	public static void main(String[] args) throws Exception {

		Calendar cal = Calendar.getInstance();
		cal.set(2010, Calendar.OCTOBER, 31);
		
		HolidayCalendar calendar  = new HolidayCalendar();
		calendar.addExcludedDate(cal.getTime());
		
		Scheduler scheduler = new StdSchedulerFactory().getScheduler();
		scheduler.start();
		
		scheduler.addCalendar("calendar", calendar, true, false);
		
		JobDetail jobDetail = new JobDetail("messageJob",
				Scheduler.DEFAULT_GROUP, MessageJob.class);
		
		Map map = jobDetail.getJobDataMap();
		map.put("message", "This is a message from Quartz");

		String cronExpression = "3/5 * 17,18,19,20 * * ?";
		
		Trigger trigger = new CronTrigger("cronTrigger",
				Scheduler.DEFAULT_GROUP, cronExpression);
		
		scheduler.scheduleJob(jobDetail, trigger);
	}
}


需要说明几点:

    1)创建了HolidayCalendar实例,使用addExcluderData()方法排除了2010年10月31日。再使用addCalendar()方法,将这个Calendar加入到Scheduler中。

    2)这个cron表达式的含义是,每天17:00-20:59之间每一分钟的第三秒开始运行,每五秒执行一次。

三. Spring对Quartz调度的支持

    Spring对Quartz集成与其对JDK Timer调度集成类似,你可以在配置文件中配置任务调度。仅需要在程序里加载ApplicationContext,Spring会自动启动调度器。

quartz.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="job"
		class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="jobClass">
			<value> com.learnworld.quartz.MessageJob </value>
		</property>
		<property name="jobDataAsMap">
			<map>
				<entry key="message">
					<value>This is a message from Spring Quartz configuration!</value>
				</entry>
			</map>
		</property>
	</bean>
	<bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="startDelay">
			<value>1000</value>
		</property>
		<property name="repeatInterval">
			<value>3000</value>
		</property>
		<property name="jobDetail">
			<ref local="job" />
		</property>
	</bean>

	<bean id="schdulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref local="trigger" />
			</list>
		</property>
	</bean>
</beans>


SimpleSpringQuartzIntegration.java
package com.learnworld.quartz;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class SimpleSpringQuartzIntegration {

	public static void main(String[] args) {

		ApplicationContext ac = new FileSystemXmlApplicationContext("src/conf/quartz.xml");
	}

}


需要说明几点:

    1)采用JobDetailBean类,它扩展了JobDetai类,采用可声明方式配置任务数据。缺省情况下,采用<bean>标签的id作为任务名,使用缺省组作为组名,通过jobDataAsMap作为配置任务数据。

    2)建立触发器。可以选择SimpleTriggerBean或CronTriggerBean类。SimpleTriggerBean缺省情况下把可重复执行次数设为无限。

    3)创建schedulerFactory。缺省情况下,SchedulerFactoryBean创建一个StdSchedulerFactory的实例,后者创建Scheduler的实现。可以通过设置schedulerFactoryClass属性来覆盖这个行为,需要继承SchedulerFactory接口来实现你自己的版本。
分享到:
评论
11 楼 cesymm 2011-03-17  
能不能弄点高级的?如我动态修改trigger等.....
10 楼 learnworld 2011-03-05  
kyan54 写道
[2010-11-25 13:47:22]ERROR org.springframework.web.context.ContextLoader(line:215) -Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'quartzScheduler' defined in file [F:\Project\My2Space\.metadata\.plugins\com.genuitec.eclipse.easie.tomcat.myeclipse\tomcat\webapps\quartzMonitor\WEB-INF\classes\spring\applicationContext-quartz.xml]: Invocation of init method failed; nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: 第 1 行: 只有 DECLARE CURSOR 才允许使用 FOR UPDATE 子句。 [See nested exception: com.microsoft.sqlserver.jdbc.SQLServerException: 第 1 行: 只有 DECLARE CURSOR 才允许使用 FOR UPDATE 子句。]]



这个错误是为什么啊???

能否把你的配置文件贴出来,看上去应该是任务配置的数据源和已有的其他数据源冲突了。
9 楼 kyan54 2010-11-25  
[2010-11-25 13:47:22]ERROR org.springframework.web.context.ContextLoader(line:215) -Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'quartzScheduler' defined in file [F:\Project\My2Space\.metadata\.plugins\com.genuitec.eclipse.easie.tomcat.myeclipse\tomcat\webapps\quartzMonitor\WEB-INF\classes\spring\applicationContext-quartz.xml]: Invocation of init method failed; nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: 第 1 行: 只有 DECLARE CURSOR 才允许使用 FOR UPDATE 子句。 [See nested exception: com.microsoft.sqlserver.jdbc.SQLServerException: 第 1 行: 只有 DECLARE CURSOR 才允许使用 FOR UPDATE 子句。]]



这个错误是为什么啊???
8 楼 applepaihs 2010-11-17  
不错,写得很好啊,我就拿这个当作入门的例子来参考了```
7 楼 晨夕0599 2010-11-04  
不懂为什么要用spring来调用Quartz
6 楼 andey007518 2010-11-04  
呵呵,辛苦lz了,没事也多练习下,收下了~~~
5 楼 markxing 2010-11-04  
都是书上说的... 基本照搬 不过还是辛苦楼主了
4 楼 yuhe 2010-11-04  
谢楼主,不过楼主可以分享下 动态设置 经验。
否则,没多大意义,死的,大家都会。
3 楼 sarin 2010-11-03  
2 楼 yin_bp 2010-11-02  
建议大家看看bbossgroups中所带的quartz任务调度器,也比较好用哩
任务管理配置文件
一个简单的配置文件
/bbossaop/resources/org/frameworkset/task/quarts-task.xml的内容如下:

<properties>
<property name="taskconfig" enable="true">
<list>
<property name="定时任务执行器" taskid="default"
class="org.frameworkset.task.DefaultScheduleService" used="true">
<!--
可执行的任务项
属性说明:
name:任务项名称
id:任务项标识
action:具体的任务执行处理程序,实现org.frameworkset.task.Execute接口
cron_time: cron格式的时间表达式,用来管理任务执行的生命周期,相关的规则请参照日期管理控件quartz的说明文档
used 是否使用
true 加载,缺省值
false 不加载  
子元素说明:
Map 和property:设置任务执行的参数,name标识参数名称,value指定参数的值
-->
<list>
<property name="workbroker" jobid="workbroker"
class="org.frameworkset.task.TestJob"
cronb_time="0 56 14 * * ?" used="true">
<map>
<property name="send_count" value="2" />
</map>
</property>
</list>
</property>
</list>
</property>
</properties>

说明:
org.frameworkset.task.DefaultScheduleService是系统中默认提供的任务管理组件,用来加载系统中默认的静态的任务,可以配置多个,例如:
<property name="workbroker" jobid="workbroker"
action="org.frameworkset.task.TestJob"
cronb_time="0 56 14 * * ?" used="true">
<map>
<property name="send_count" value="2" />
</map>
</property>

属性说明:
Taskid:用来区分任务组,可以作为任务组的唯一标识,系统中通过Taskid和jobid来区分唯一的一个作业任务,TaskService组件的很多方法中都有groupid和jobname两个参数,taskid就对应于groupid参数,jobid对应于 jobname参数。
Name 任务的名称
Jobid 任务的标识
Action任务执行的操作
cronb_time 任务执行的调度时间,具体需要参考cronb_time的语法。
use:区分任务是否生效
内嵌的节点
<map>
<property name="send_count" value="2" />
</map>
用来指定任务执行时需要的参数。
需要特别说明的是Action类必须实现org.frameworkset.task.Execute接口,例如:
public class TestJob implements Execute, Serializable {
public void execute(Map parameters) {
System.out.println("send_count = "+parameters.get("send_count"));
}

} 
1 楼 learnworld 2010-11-02  
tterry 写道
没看出来HelloWorldJob跟MessageScheduler有什么关系??楼主是否拷错了,少个HelloScheduler?

谢谢提醒,我把HelloScheduler拷贝成MessageScheduler,已经修改过来。

相关推荐

    Spring整合任务调度框架Quartz

    Spring 整合任务调度框架 Quartz 在软件开发中,任务调度框架是非常重要的一部分,它可以帮助开发者更好地管理和执行各种任务。在 Java 领域中,Quartz 是一个非常流行的任务调度框架,而 Spring 是一个非常流行的 ...

    spring任务调度(Quartz )

    Spring中的任务调度是实现应用程序自动化运行任务的重要工具,而Quartz是Java领域广泛使用的开源任务调度框架。在本文中,我们将深入探讨如何在Spring中集成Quartz进行任务调度,并通过一个简单的示例来理解其工作...

    spring 任务调度

    Spring Task是Spring内置的轻量级任务调度器,而Quartz是更强大的第三方调度库,可以在Spring中集成使用。 1. **Spring Task** - **基本概念**:Spring Task是Spring框架的一部分,提供了基本的定时任务调度功能,...

    spring 任务调度实现代码例子

    下面将详细解释Spring任务调度的关键概念和实现方法。 1. **Spring Task模块** Spring Task是Spring框架内置的任务调度模块,它提供了简单的定时任务执行能力。通过使用Spring Task,我们可以轻松地在应用中添加...

    Spring+Quartz实现任务调度的小例子

    Spring框架和Quartz是两个广泛使用的工具,它们可以协同工作以实现复杂和灵活的任务调度。本篇文章将深入探讨如何使用Spring与Quartz结合来创建一个任务调度的小例子。 首先,Spring是一个开源的Java企业级应用开发...

    Spring Quartz 任务调度实例

    Spring Quartz 是一个强大的任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。结合Spring框架,可以方便地在企业级应用中实现复杂的时间触发逻辑。本实例提供了可以直接运行的任务调度解决方案,既...

    quartz3种调度形式+传参.zip

    总结,Quartz的三种调度形式满足了不同场景下的定时任务需求,而与Spring的整合则进一步提升了其易用性和可维护性。了解并掌握这些知识,对于开发Java后台服务,特别是涉及到定时任务处理的项目,有着重要的实践价值...

    Spring任务调度配置及说明(spring+quartz)

    《Spring任务调度配置详解:Spring+Quartz的整合应用》 在Java开发中,任务调度是不可或缺的一部分,Spring框架提供了与Quartz集成的能力,使得我们可以方便地管理和执行定时任务。本文将详细介绍如何通过Spring和...

    Spring实现任务调度

    本篇将深入探讨如何利用Spring进行任务调度,并结合代码演示和Quartz库的使用来丰富这一主题。 首先,Spring提供了两种主要的任务调度机制:Spring内置的`TaskExecution`和`TaskScheduling`以及与Quartz Scheduler...

    Spring 中任务调度 TimeTask 与quartz简单用法

    本篇文章将详细探讨Spring中的两种常见任务调度工具:`TimerTask`和`Quartz`,以及如何配置`cronExpression`来精确控制任务的执行时间。 首先,我们来了解`TimerTask`。`TimerTask`是Java内置的定时任务类,它继承...

    Spring Quartz 任务调度

    **Spring Quartz 任务调度** Spring Quartz 是一个基于 Java 的任务调度框架,它允许开发者定义定时任务并在应用程序中灵活地调度这些任务。这个框架是 Spring 和 Quartz Scheduler 的集成,提供了与 Spring 框架的...

    spring+quartz任务调度代码版

    本项目"spring+quartz任务调度代码版"显然是一个结合了这两者的实践案例,旨在展示如何在Spring环境下集成和使用Quartz进行任务调度。 Spring框架是一个开源的应用框架,它提供了丰富的功能,包括依赖注入、AOP...

    spring timer、quartz俩种任务调度

    总的来说,`Spring Timer`适合简单的定时任务需求,而`Quartz Scheduler`更适合处理大型项目或需要高级调度功能的场景。在实际应用中,开发者可以根据项目需求选择合适的任务调度器。通过`spring-taskScheduling`这...

    spring定时任务之Quartz

    Quartz是Java领域一个强大的、开源的作业调度框架,它允许开发者灵活地定义任务和调度策略。这篇博客将探讨如何在Spring中集成Quartz来实现定时任务。 首先,我们需要引入Quartz的依赖。在Maven的pom.xml文件中,...

    spring整合quartz定时任务调度

    6. **启动Scheduler**:在Spring应用启动时,通过调用Scheduler的`start()`方法来启动定时任务调度。 7. **动态管理任务**:通过Spring的`Scheduler`实例,你可以方便地进行任务的添加、删除、暂停和恢复等操作,...

    spring之定时任务实现(spring-task和quartz等不同方式)

    Spring框架提供了一系列工具来支持定时任务的实现,其中包括Spring自带的`spring-task`模块和第三方的Quartz库。下面我们将详细探讨这两种方式以及如何通过注解和非注解的方式进行配置。 首先,`spring-task`是...

    Spring实现任务调度.rar

    除了内置的`TaskScheduler`,Spring还支持集成第三方任务调度库,如Quartz。Quartz是一个强大且功能丰富的作业调度框架,允许创建复杂的调度规则。在描述中提到的`quartz-all-1.6.1.jar`是Quartz库的旧版本,可能...

    spring quartz 任务调度

    Spring框架作为一个全面的企业级应用开发解决方案,提供了强大的任务调度支持,而Quartz则是一个流行的开源作业调度库,能够与Spring很好地集成。现在,我们就来深入探讨"spring quartz 任务调度"这一主题。 首先,...

    Quartz任务调度器

    总的来说,Quartz任务调度器与Spring的整合使得我们能够在应用中轻松地实现定时任务的管理,而无需关心任务执行的具体细节。它为开发者提供了一套强大的工具,帮助我们在项目中实现定时任务的自动化,提高系统的运行...

    Spring quartz任务调度

    标题“Spring quartz任务调度”指的是在Java开发中利用Spring框架集成Quartz库来实现应用程序的任务调度功能。Quartz是一款开源的作业调度框架,它允许开发者安排任务在特定时间执行,而Spring框架则提供了与Quartz...

Global site tag (gtag.js) - Google Analytics