1. 程式人生 > >使用quartz+spring實現簡單的可配置化的定時任務(可和資料庫配套使用)

使用quartz+spring實現簡單的可配置化的定時任務(可和資料庫配套使用)

需要的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();
		}

	}

}
完成。