1. 程式人生 > >Quartz 2.2 動態新增、修改和刪除定時任務

Quartz 2.2 動態新增、修改和刪除定時任務

下面直接上程式碼:
QuartzManager.java 動態新增、修改和刪除定時任務管理類

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import
org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.quartz.impl.StdSchedulerFactory; public class QuartzManager { private static SchedulerFactory schedulerFactory = new StdSchedulerFactory(); /** * @Description: 新增一個定時任務 * * @param jobName 任務名 * @param
jobGroupName 任務組名 * @param triggerName 觸發器名 * @param triggerGroupName 觸發器組名 * @param jobClass 任務 * @param cron 時間設定,參考quartz說明文件 */
@SuppressWarnings({ "unchecked", "rawtypes" }) public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass, String cron) { try
{ Scheduler sched = schedulerFactory.getScheduler(); // 任務名,任務組,任務執行類 JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build(); // 觸發器 TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger(); // 觸發器名,觸發器組 triggerBuilder.withIdentity(triggerName, triggerGroupName); triggerBuilder.startNow(); // 觸發器時間設定 triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron)); // 建立Trigger物件 CronTrigger trigger = (CronTrigger) triggerBuilder.build(); // 排程容器設定JobDetail和Trigger sched.scheduleJob(jobDetail, trigger); // 啟動 if (!sched.isShutdown()) { sched.start(); } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 修改一個任務的觸發時間 * * @param jobName * @param jobGroupName * @param triggerName 觸發器名 * @param triggerGroupName 觸發器組名 * @param cron 時間設定,參考quartz說明文件 */ public static void modifyJobTime(String jobName, String jobGroupName, String triggerName, String triggerGroupName, String cron) { try { Scheduler sched = schedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); if (trigger == null) { return; } String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(cron)) { /** 方式一 :呼叫 rescheduleJob 開始 */ // 觸發器 TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger(); // 觸發器名,觸發器組 triggerBuilder.withIdentity(triggerName, triggerGroupName); triggerBuilder.startNow(); // 觸發器時間設定 triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron)); // 建立Trigger物件 trigger = (CronTrigger) triggerBuilder.build(); // 方式一 :修改一個任務的觸發時間 sched.rescheduleJob(triggerKey, trigger); /** 方式一 :呼叫 rescheduleJob 結束 */ /** 方式二:先刪除,然後在建立一個新的Job */ //JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName)); //Class<? extends Job> jobClass = jobDetail.getJobClass(); //removeJob(jobName, jobGroupName, triggerName, triggerGroupName); //addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron); /** 方式二 :先刪除,然後在建立一個新的Job */ } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 移除一個任務 * * @param jobName * @param jobGroupName * @param triggerName * @param triggerGroupName */ public static void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) { try { Scheduler sched = schedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); sched.pauseTrigger(triggerKey);// 停止觸發器 sched.unscheduleJob(triggerKey);// 移除觸發器 sched.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 刪除任務 } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description:啟動所有定時任務 */ public static void startJobs() { try { Scheduler sched = schedulerFactory.getScheduler(); sched.start(); } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description:關閉所有定時任務 */ public static void shutdownJobs() { try { Scheduler sched = schedulerFactory.getScheduler(); if (!sched.isShutdown()) { sched.shutdown(); } } catch (Exception e) { throw new RuntimeException(e); } } }

MyJob.java 任務類

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob implements Job{

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println(new Date() + ": doing something...");
    }
}

Test.Java 測試類

public class Test {

    public static String JOB_NAME = "動態任務排程";  
    public static String TRIGGER_NAME = "動態任務觸發器";  
    public static String JOB_GROUP_NAME = "XLXXCC_JOB_GROUP";  
    public static String TRIGGER_GROUP_NAME = "XLXXCC_JOB_GROUP"; 

    public static void main(String[] args) {
        try {  
            System.out.println("【系統啟動】開始(每1秒輸出一次)...");    
            QuartzManager.addJob(JOB_NAME, JOB_GROUP_NAME, TRIGGER_NAME, TRIGGER_GROUP_NAME, MyJob.class, "0/1 * * * * ?");    

            Thread.sleep(5000);    
            System.out.println("【修改時間】開始(每5秒輸出一次)...");    
            QuartzManager.modifyJobTime(JOB_NAME, JOB_GROUP_NAME, TRIGGER_NAME, TRIGGER_GROUP_NAME, "0/5 * * * * ?");    

            Thread.sleep(6000);    
            System.out.println("【移除定時】開始...");    
            QuartzManager.removeJob(JOB_NAME, JOB_GROUP_NAME, TRIGGER_NAME, TRIGGER_GROUP_NAME);    
            System.out.println("【移除定時】成功");    
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }
}