基本概念
任务(job):需要被调度以指定的时间间隔运行的任务单元。
触发器(trigger):引发任务运行的条件。
调度计划(schedule):一个任务和用来管理这个任务的一组触发器的集合。
通常一个任务在他的调度计划中只有一个触发器,所以触发器和调度计划这两个概念通常可以互换。
第一种:Spring对JDK Timer调度的支持
目的:许多任务需要配置数据,采用spring管理,使得程序易于配置。
触发器信息是硬编码到程序里的,意味着对任务触发时间的修改都要修改程序并重新编译。
调度新任务或移除任务都需要修改程序代码,这可以通过spring来配置。
核心类:
ScheduleTimerTask: 扮演TimerTask的包装器实现,允许你为这个任务定义触发器信息。
TimerFactoryBean:让spring使用配置创建触发器,为一组指定的scheduledTimerTask bean自动创建Timer实例。
实现:
1. 定义了任务类;
/*******************************************************************************
* @(#)MyTask.java 2014-1-19
*
* Copyright 2014 juluce. All rights reserved.
*******************************************************************************/
package com.juluce.schedule.timer;
/**
* <b>Application name:</b> MyTask.java <br>
* <b>Application describing: </b> <br>
* <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
* <b>Company:</b> juluce <br>
* <b>Date:</b> 2014-1-19 <br>
* @author <a href="mailto:juluce133@sina.com"> juluce </a>
* @version V1.0
*/
public class MyTask {
private String name;
public void run() {
System.out.println("执行的任务是: " + name + ".");
}
/**
* name的GET方法
* @return String name.
* @date: 2014-1-19
* @author: juluce
*/
public String getName() {
return name;
}
/**
* name的SET方法
* @param name The name to set.
* @date: 2014-1-19
* @author: juluce
*/
public void setName(String name) {
this.name = name;
}
}
2. 利用spring提供的MethodInvokingTimerTaskFactoryBean类来实现来实现对对task类和方法的声明,声明目标对象和方法,从而使spring知道要运行那个类的那个方法。 利用ScheduledTimerTask类来配置每个task的启动时间延时,每次启动之间的间隔,当然还有最重要的是需要运行那个对象,这里使用的上面提到的MethodInvokingTimerTaskFactoryBean类的实例;
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-lazy-init="true">
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"
lazy-init="false">
<property name="scheduledTimerTasks">
<list>
<ref local="scheduledTask1" />
<ref local="scheduledTask2" />
</list>
</property>
</bean>
<bean id="scheduledTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="delay" value="0" />
<property name="period" value="10000" />
<property name="timerTask">
<ref bean="methodInvokingTask1" />
</property>
</bean>
<bean id="scheduledTask2" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="delay" value="0" />
<property name="period" value="10000" />
<property name="timerTask">
<ref bean="methodInvokingTask2" />
</property>
</bean>
<bean id="methodInvokingTask1"
class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="myTask1" />
<property name="targetMethod" value="run" />
</bean>
<bean id="methodInvokingTask2"
class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="myTask2" />
<property name="targetMethod" value="run" />
</bean>
<bean id="myTask1" class="com.juluce.schedule.timer.MyTask">
<property name="name" value="task1" />
</bean>
<bean id="myTask2" class="com.juluce.schedule.timer.MyTask">
<property name="name" value="task2" />
</bean>
</beans>
3. 最后定义了一个测试类,并且把ScheduledTimerTask类的实例作为需要调度的task;
/*******************************************************************************
* @(#)Test.java 2014-1-19
*
* Copyright 2014 juluce. All rights reserved.
*******************************************************************************/
package com.juluce.schedule.timer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* <b>Application name:</b> Test.java <br>
* <b>Application describing: </b> <br>
* <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
* <b>Company:</b> juluce <br>
* <b>Date:</b> 2014-1-19 <br>
* @author <a href="mailto:juluce133@sina.com"> juluce </a>
* @version V1.0
*/
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("com/juluce/schedule/timer/spring.xml");
}
}
第二种:Spring任务调度Quartz simple trigger
实现
1 首先,需要定义了一个Task类,具体的任务逻辑可以写在这个类里;
/*******************************************************************************
* @(#)MyTask.java 2014-1-19
*
* Copyright 2014 juluce. All rights reserved.
*******************************************************************************/
package com.juluce.schedule.quartz;
/**
* <b>Application name:</b> MyTask.java <br>
* <b>Application describing: </b> <br>
* <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
* <b>Company:</b> juluce <br>
* <b>Date:</b> 2014-1-19 <br>
* @author <a href="mailto:juluce133@sina.com"> juluce </a>
* @version V1.0
*/
public class MyTask {
private String name;
public void run() {
System.out.println("执行的任务是: " + name + ".");
}
/**
* name的GET方法
* @return String name.
* @date: 2014-1-19
* @author: juluce
*/
public String getName() {
return name;
}
/**
* name的SET方法
* @param name The name to set.
* @date: 2014-1-19
* @author: juluce
*/
public void setName(String name) {
this.name = name;
}
}
2 定义一个JobDetailBean类的bean,这个是为了适应Quartz的JobDetail,其中可以定义name,group,description等信息,这些信息主要是为了和别的作业做区分使用;其中还有一个jobClass属性,定义了使用的是那个Job类实例,这里使用第二步创建的MyJob类;最后定义了一个叫jobDataAsMap的属性,这个属性是Quartz提供的用来传递参数使用的一个Map集合,这些集合里的类会被spring自动注入到目标Job类中;
/*******************************************************************************
* @(#)MyJob.java 2014-1-19
*
* Copyright 2014 juluce. All rights reserved.
*******************************************************************************/
package com.juluce.schedule.quartz;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* <b>Application name:</b> MyJob.java <br>
* <b>Application describing: </b> <br>
* <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
* <b>Company:</b> juluce <br>
* <b>Date:</b> 2014-1-19 <br>
* @author <a href="mailto:juluce133@sina.com"> juluce </a>
* @version V1.0
*/
public class MyJob extends QuartzJobBean {
private MyTask myTask;
/*
* (non-Javadoc)
* @see org.springframework.scheduling.quartz.QuartzJobBean#executeInternal(org.quartz.
* JobExecutionContext)
* @date: 2014-1-19
* @author: juluce
*/
@Override
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
myTask.run();
}
/**
* myTask的GET方法
* @return MyTask myTask.
* @date: 2014-1-19
* @author: juluce
*/
public MyTask getMyTask() {
return myTask;
}
/**
* myTask的SET方法
* @param myTask The myTask to set.
* @date: 2014-1-19
* @author: juluce
*/
public void setMyTask(MyTask myTask) {
this.myTask = myTask;
}
}
3 创建一个触发器类,这里使用的是Quartz提供的Simple Trigger,在Spring里,使用的是SimpleTriggerBean来做映射,主要是定义了第一次运行的延时时间,每次重复执行之间的间隔,当然还有最主要的具体的Job类实例;最后定义了一个SchedulerFactoryBean的bean,其中定义了具体要调度那些触发器;
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-lazy-init="true">
<bean id="timerFactory"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
lazy-init="false">
<property name="triggers">
<list>
<ref local="simpleTrigger" />
</list>
</property>
</bean>
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="myJob" />
<property name="startDelay" value="0" />
<property name="repeatInterval" value="10000" />
</bean>
<bean id="myJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="name" value="myJob" />
<property name="group" value="myGroup" />
<property name="description" value="myJob" />
<property name="jobClass"
value="com.juluce.schedule.quartz.MyJob" />
<property name="jobDataAsMap">
<map>
<entry key="myTask" value-ref="myTask" />
</map>
</property>
</bean>
<bean id="myTask" class="com.juluce.schedule.quartz.MyTask">
<property name="name" value="my task" />
</bean>
</beans>
4. 最后,写一个测试类来测试上面的代码和配置
/*******************************************************************************
* @(#)Test.java 2014-1-19
*
* Copyright 2014 juluce. All rights reserved.
*******************************************************************************/
package com.juluce.schedule.quartz;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* <b>Application name:</b> Test.java <br>
* <b>Application describing: </b> <br>
* <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
* <b>Company:</b> juluce <br>
* <b>Date:</b> 2014-1-19 <br>
* @author <a href="mailto:juluce133@sina.com"> juluce </a>
* @version V1.0
*/
public class Test {
/**
* {方法功能中文描述}
* @param args
* @author: juluce
*/
public static void main(String[] args) {
new ClassPathXmlApplicationContext("com/juluce/schedule/quartz/spring.xml");
}
}
第三种:Spring任务调度Quartz Cron trigger
实现
1 首先,需要定义了一个Task类,具体的任务逻辑可以写在这个类里;
/*******************************************************************************
* @(#)MyTask.java 2014-1-19
*
* Copyright 2014 juluce. All rights reserved.
*******************************************************************************/
package com.juluce.schedule.quartz.trigger;
/**
* <b>Application name:</b> MyTask.java <br>
* <b>Application describing: </b> <br>
* <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
* <b>Company:</b> juluce <br>
* <b>Date:</b> 2014-1-19 <br>
* @author <a href="mailto:juluce133@sina.com"> juluce </a>
* @version V1.0
*/
public class MyTask {
private String name;
public void run() {
System.out.println("执行的任务是: " + name + ".");
}
/**
* name的GET方法
* @return String name.
* @date: 2014-1-19
* @author: juluce
*/
public String getName() {
return name;
}
/**
* name的SET方法
* @param name The name to set.
* @date: 2014-1-19
* @author: juluce
*/
public void setName(String name) {
this.name = name;
}
}
2 定义一个JobDetailBean类的bean,这个是为了适应Quartz的JobDetail,其中可以定义name,group,description等信息,这些信息主要是为了和别的作业做区分使用;其中还有一个jobClass属性,定义了使用的是那个Job类实例,这里使用第二步创建的MyJob类;最后定义了一个叫jobDataAsMap的属性,这个属性是Quartz提供的用来传递参数使用的一个Map集合,这些集合里的类会被spring自动注入到目标Job类中;
/*******************************************************************************
* @(#)MyJob.java 2014-1-19
*
* Copyright 2014 juluce. All rights reserved.
*******************************************************************************/
package com.juluce.schedule.quartz.trigger;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* <b>Application name:</b> MyJob.java <br>
* <b>Application describing: </b> <br>
* <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
* <b>Company:</b> juluce <br>
* <b>Date:</b> 2014-1-19 <br>
* @author <a href="mailto:juluce133@sina.com"> juluce </a>
* @version V1.0
*/
public class MyJob extends QuartzJobBean {
private MyTask myTask;
/*
* (non-Javadoc)
* @see org.springframework.scheduling.quartz.QuartzJobBean#executeInternal(org.quartz.
* JobExecutionContext)
* @date: 2014-1-19
* @author: juluce
*/
@Override
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
myTask.run();
}
/**
* myTask的GET方法
* @return MyTask myTask.
* @date: 2014-1-19
* @author: juluce
*/
public MyTask getMyTask() {
return myTask;
}
/**
* myTask的SET方法
* @param myTask The myTask to set.
* @date: 2014-1-19
* @author: juluce
*/
public void setMyTask(MyTask myTask) {
this.myTask = myTask;
}
}
3 创建一个触发器类,这里使用的是Quartz提供的Cron Trigger,在Spring里,使用的是CronTriggerBean来做映射,主要是定义cron表达式,具体可以参考quartz的官方文档,这里定义的是每隔10秒运行一次;当然还有最主要的具体的Job类实例; 最后定义了一个SchedulerFactoryBean的bean,其中定义了具体要调度那些触发器;
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-lazy-init="true">
<bean id="timerFactory"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
lazy-init="false">
<property name="triggers">
<list>
<ref local="cronTrigger" />
</list>
</property>
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="myJob" />
<property name="cronExpression" value="0/10 * * * * ?"></property>
</bean>
<bean id="myJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="name" value="myJob" />
<property name="group" value="myGroup" />
<property name="description" value="myJob" />
<property name="jobClass"
value="com.juluce.schedule.quartz.trigger.MyJob" />
<property name="jobDataAsMap">
<map>
<entry key="myTask" value-ref="myTask" />
</map>
</property>
</bean>
<bean id="myTask" class="com.juluce.schedule.quartz.trigger.MyTask">
<property name="name" value="my task" />
</bean>
</beans>
4. 最后,写一个测试类来测试上面的代码和配置
/*******************************************************************************
* @(#)Test.java 2014-1-19
*
* Copyright 2014 juluce. All rights reserved.
*******************************************************************************/
package com.juluce.schedule.quartz.trigger;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* <b>Application name:</b> Test.java <br>
* <b>Application describing: </b> <br>
* <b>Copyright:</b> Copyright © 2014 juluce 版权所有。<br>
* <b>Company:</b> juluce <br>
* <b>Date:</b> 2014-1-19 <br>
* @author <a href="mailto:juluce133@sina.com"> juluce </a>
* @version V1.0
*/
public class Test {
/**
* {方法功能中文描述}
* @param args
* @author: juluce
*/
public static void main(String[] args) {
new ClassPathXmlApplicationContext("com/juluce/schedule/quartz/trigger/spring.xml");
}
}
如此遍实现了任务调度的三种方式。以上都是基于spring3.0.5所做,具体架包可以上我的资源中下载,因为是自己手写,所以收取一积分的辛苦钱,忘见谅。
架包地址:http://download.csdn.net/detail/juluce133/6863949