您的位置:首页 > 编程语言 > Java开发

Quartz任务调度器及其在Spring中的使用

2015-01-29 17:48 567 查看

一、原生的quartz框架的使用:

1.导入jar包:可以去quartz官网下载

2.创建Java类,实现Job接口中的execute方法

package com.wzj.prototype.task;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 自定义任务类
*/
public class MyJob implements Job{

@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("起床啦~");
}

}


3.测试类中代码如下:

package com.wzj.prototype.test;

import java.util.Calendar;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.HolidayCalendar;

import com.wzj.prototype.task.MyJob;

public class PrototypeDemo {

/**
* @param args
* @throws SchedulerException
*/
public static void main(String[] args) throws SchedulerException {

/**
* 一、创建调度器
* 用来绑定触发器和任务,任务调度离不开这三个对象:任务、触发器、调度器
*/
Scheduler scheduler=new StdSchedulerFactory().getScheduler();
/**
* 二、创建JobDetail任务对象
* 1.使用JobBuilder.newJob()方法创建JobBuilder对象
* 2.ofType():指定任务 的类型
* 3.withIdentity():为任务指定标识,便于管理
* 	 param1:任务的名称
* 	 param2:任务所在组
* 4.build():构建JobDetail对象
*/
JobDetail jobDetail=JobBuilder.newJob()
.ofType(MyJob.class)
.withIdentity("myJob", "myJobGroup")
.build();

/**
* 三、 创建Trigger触发器,即时间规则,分为SimpleScheduleBuilder和CronScheduleBuilder
* 1.startNow():立即开始,其中还包含很多开始的方法,可以自行查看
* 2.withSchedule():以什么规则定义触发器
*   SimpleScheduleBuilder中提供了多种静态方法,按照时、分、秒等方式定义,这里的参数:
*   param1:总共执行10次
*   param2:每3秒执行一次
*/
Trigger simpleTrigger=TriggerBuilder.newTrigger()
.startNow()
.withIdentity("trigger","triggerGroup")
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(10, 3))
.build();
/**
* 使用调度器绑定并启动调度器
*/
scheduler.scheduleJob(jobDetail, simpleTrigger);
scheduler.start();

}

}


输出结果:打印了10次“起床啦~”

4.使用CronScheduleBuilder定义时间规则:

Trigger cronTrigger=TriggerBuilder.newTrigger()
.startNow()
.withIdentity("trigger2", "triggerGroup")
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 44 16 29 1 ? 2015"))
.build();


使用CronScheduleBuilder只需要定义好Cron表达式就可以了,即方法中传递的字符串。Cron表达式由6~7个由空格分隔的时间元素组成,第7个元素可选



欲了解更详细,参见百度文库:http://wenku.baidu.com/link?url=vLPUSfBOmRUXE6PwKcPw0UZaHtSdtbeVW0QpVw8cuCV9J04jrLNW_2WNKbUf3xs-l1bwLDtOMnjLT3Cyppx7THess6O3DY2oqQcPHkjlPk_

SimpleScheduleBuilder和CronScheduleBuilder的区别:

触发器应用场景使用方式
SimpleTrigger固定时间间隔的调度任务(例如:每隔2小时执行1次)通过设置触发器的属性:开始时间、结束时间、重复次数、重复间隔等
CronTrigger指定时间点的调度任务(例如:每天凌晨1:00执行1次)通过定义Cron表达式
5.使用Calendar排除特殊时间

如果有时候比如10月1日——国庆节,我们不想让这个任务执行,此时就要排除掉这个特殊的日期

代码如下:

public static void main(String[] args) throws SchedulerException {
//省略其他

//创建一个java.util.Calendar日历类,并设置日期时间
Calendar calendar=Calendar.getInstance();
calendar.set(Calendar.MONTH, Calendar.OCTOBER);
calendar.set(Calendar.DATE, 1);
//创建假期日历,用来排除以上的时间
HolidayCalendar holiday=new HolidayCalendar();
holiday.addExcludedDate(calendar.getTime());
//在调度器中注册
scheduler.addCalendar("guoQing", holiday, true, true);

Trigger simpleTrigger=TriggerBuilder.newTrigger()
//省略其他
.modifiedByCalendar("guoQing")//【千万不要忘记在这里注明时间法则根据此日历进行调整】
.build();
/**
* 使用调度器绑定并启动调度器
*/
scheduler.scheduleJob(jobDetail, simpleTrigger);
scheduler.start();
}


二、在spring中使用Quartz

1.加入spring所需jar包,创建一个MyJob类,此时,不用实现任何接口:

package com.wzj.spring.task;
/**
* 创建普通类,不必实现接口
*/
public class MyJob {
//方法自定义
public void remind(String name){
System.out.println(name+",快起床!");
}
}


2.配置spring配置文件applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <!--
1.创建一个任务对象的bean,spring提供了MethodInvokingJobDetailFactoryBean类
-->
<bean id="myJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 提供了targetObject和targetClass类型指定自定义类 -->
<property name="targetObject">
<!-- 为了方便,就在此定义了个内部bean -->
<bean class="com.wzj.spring.task.MyJob"/>
</property>
<!-- 指定任务方法 -->
<property name="targetMethod" value="remind"/>
<!-- 为方法传递参数 -->
<property name="arguments">
<list>
<value>Jack</value>
</list>
</property>
</bean>

<!-- 2.创建触发器对象 ,spring提供了SimpleTriggerFactoryBean类-->
<bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!-- 1000毫秒之后执行 -->
<property name="startDelay" value="1000"/>
<!-- 隔多长时间重复一次 -->
<property name="repeatInterval" value="3000"/>
<!--
总共重复多少次!注意,是【重复】!也就是说会执行6次,这点与java中有些不同,java中时【总共】执行多少次。
-->
<property name="repeatCount" value="5"/>
<!-- 这里和java里面略微不同,在这里直接关联上任务,然后在与调度器关联的时候只关联触发器就行了 -->
<property name="jobDetail" ref="myJob"/>
</bean>
<!-- 3.创建调度器,spring提供了SchedulerFactoryBean类 -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="trigger"/>
</list>
</property>
</bean>
</beans>


3.Main方法中只要写一句启动spring容器的代码就可以了,spring容器在气动式会自动的为我们创建任务调度的各个实例

public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
}


4.结果:输出6次“Jack,快起床!”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: