需要的jar包:
spring-context-support-4.0.1.RELEASE.jar
quartz-2.2.1.jar
首先定义一个job要实现Job接口,以后各种各样的任务都放在这个job中执行:
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJobClass implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
JobDataMap mergedJobDataMap = arg0.getMergedJobDataMap();
Class clazz;
try {
//从mergedJobDataMap中获取绑定的任务类
clazz = Class.forName(mergedJobDataMap.get("jobPara").toString());
//创建实例
MyTaskDo myTaskDo = (MyTaskDo) clazz.newInstance();
//调用执行方法
myTaskDo.printSomething();
} catch (Exception e) {
e.printStackTrace();
}
}
然后定义一个任务接口,后面所有的自定义任务类都实现此接口:
public interface MyTaskDo {
public void printSomething();
}
编写两个自定义任务,如下:
1.
package com.joey.work.quartz.example;
public class MyTask1 implements MyTaskDo{
@Override
public void printSomething() {
System.out.println("我是任务111111");
}
}
2.
package com.joey.work.quartz.example;
public class MyTask2 implements MyTaskDo {
@Override
public void printSomething() {
System.out.println("我是任务22222");
}
}
接下来是重点了,编写一个类,使初始化Bean的时候将定时任务注册好:
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.stereotype.Component;
import com.joey.work.quartz.example.MyJobClass;
import com.joey.work.quartz.example.MyTask1;
import com.joey.work.quartz.example.MyTask2;
//把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
@Component
public class ScheduleJob {
// 当DI容器实例化当前受管Bean时,@PostConstruct注解的方法会被自动触发,从而完成一些初始化工作
@PostConstruct
public void initJob() {
SchedulerFactory schedFact = new StdSchedulerFactory();
Scheduler sched;
// ===========================添加定时任务start========================
// 此处测试范例,可以将定时任务配置在数据库中,然后查询出来,在下面的循环中依次注册
List<String> list = new ArrayList<String>();
list.add(MyTask1.class.getName());
list.add(MyTask2.class.getName());
// ===========================添加定时任务end========================
try {
sched = schedFact.getScheduler();
sched.start();
//模拟将任务从数据库中读取出来并注册到定时器中
for (int i = 0; i < 2; i++) {
Class<? extends Job> myJobClass = MyJobClass.class;
// 创建jobDetail信息
JobDetail jobDetail = JobBuilder.newJob(myJobClass)
.withIdentity("" + i, "" + i).build();
// 放入参数,运行时的方法可以获取
jobDetail.getJobDataMap().put("jobPara", list.get(i));
// 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule("0/5 * * * * ?");
// 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("" + i, "" + i)
.withSchedule(scheduleBuilder).build();
sched.scheduleJob(jobDetail, trigger);
}
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
完成。