使用quartz+spring實現簡單的可配置化的定時任務(可和資料庫配套使用)
阿新 • • 發佈:2019-01-25
需要的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.接下來是重點了,編寫一個類,使初始化Bean的時候將定時任務註冊好:package com.joey.work.quartz.example; public class MyTask2 implements MyTaskDo { @Override public void printSomething() { System.out.println("我是任務22222"); } }
完成。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(); } } }