package org.fh.util; import java.util.Map; 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.TriggerBuilder; import org.quartz.TriggerKey; import org.quartz.impl.StdSchedulerFactory; /** * 說明:定時任務管理類 * 作者:FH Admin * from:fhadmin.cn */ public class QuartzManager { private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); //創建一個SchedulerFactory工廠實體 private static String JOB_GROUP_NAME = "FH_JOBGROUP_NAME"; //任務組 private static String TRIGGER_GROUP_NAME = "FH_TRIGGERGROUP_NAME"; //觸發器組 /**添加一個定時任務,使用默認的任務組名,觸發器名,觸發器組名 * @param jobName 任務名 * @param cls 任務 * @param time 時間設定,參考quartz說明檔案 */ public static void addJob(String jobName, Class<? extends Job> cls, String time) { try { Scheduler sched = gSchedulerFactory.getScheduler(); //通過SchedulerFactory構建Scheduler物件 JobDetail jobDetail= JobBuilder.newJob(cls).withIdentity(jobName,JOB_GROUP_NAME).build(); //用于描敘Job實作類及其他的一些靜態資訊,構建一個作業實體 CronTrigger trigger = (CronTrigger) TriggerBuilder .newTrigger() //創建一個新的TriggerBuilder來規范一個觸發器 .withIdentity(jobName, TRIGGER_GROUP_NAME) //給觸發器起一個名字和組名 .withSchedule(CronScheduleBuilder.cronSchedule(time)) .build(); sched.scheduleJob(jobDetail, trigger); if (!sched.isShutdown()) { sched.start(); // 啟動 } } catch (Exception e) { throw new RuntimeException(e); } } /**添加一個定時任務,使用默認的任務組名,觸發器名,觸發器組名 (帶引數) * @param jobName 任務名 * @param cls 任務 * @param time 時間設定,參考quartz說明檔案 */ public static void addJob(String jobName, Class<? extends Job> cls, String time, Map<String,Object> parameter) { try { Scheduler sched = gSchedulerFactory.getScheduler(); //通過SchedulerFactory構建Scheduler物件 JobDetail jobDetail= JobBuilder.newJob(cls).withIdentity(jobName,JOB_GROUP_NAME).build(); //用于描敘Job實作類及其他的一些靜態資訊,構建一個作業實體 jobDetail.getJobDataMap().put("parameterList", parameter); //傳引數 CronTrigger trigger = (CronTrigger) TriggerBuilder .newTrigger() //創建一個新的TriggerBuilder來規范一個觸發器 .withIdentity(jobName, TRIGGER_GROUP_NAME) //給觸發器起一個名字和組名 .withSchedule(CronScheduleBuilder.cronSchedule(time)) .build(); sched.scheduleJob(jobDetail, trigger); if (!sched.isShutdown()) { sched.start(); // 啟動 } } catch (Exception e) { throw new RuntimeException(e); } } /**添加一個定時任務 * @param jobName 任務名 * @param jobGroupName 任務組名 * @param triggerName 觸發器名 * @param triggerGroupName 觸發器組名 * @param jobClass 任務 * @param time 時間設定,參考quartz說明檔案 */ public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class<? extends Job> jobClass, String time) { try { Scheduler sched = gSchedulerFactory.getScheduler(); JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(jobName,jobGroupName).build();// 任務名,任務組,任務執行類 CronTrigger trigger = (CronTrigger) TriggerBuilder // 觸發器 .newTrigger() .withIdentity(triggerName, triggerGroupName) .withSchedule(CronScheduleBuilder.cronSchedule(time)) .build(); sched.scheduleJob(jobDetail, trigger); if (!sched.isShutdown()) { sched.start(); // 啟動 } } catch (Exception e) { throw new RuntimeException(e); } } /**添加一個定時任務 (帶引數) * @param jobName 任務名 * @param jobGroupName 任務組名 * @param triggerName 觸發器名 * @param triggerGroupName 觸發器組名 * @param jobClass 任務 * @param time 時間設定,參考quartz說明檔案 */ public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class<? extends Job> jobClass, String time, Map<String,Object> parameter) { try { Scheduler sched = gSchedulerFactory.getScheduler(); JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(jobName,jobGroupName).build();// 任務名,任務組,任務執行類 jobDetail.getJobDataMap().put("parameterList", parameter); //傳引數 CronTrigger trigger = (CronTrigger) TriggerBuilder // 觸發器 .newTrigger() .withIdentity(triggerName, triggerGroupName) .withSchedule(CronScheduleBuilder.cronSchedule(time)) .build(); sched.scheduleJob(jobDetail, trigger); if (!sched.isShutdown()) { sched.start(); // 啟動 } } catch (Exception e) { throw new RuntimeException(e); } } /** 修改一個任務的觸發時間(使用默認的任務組名,觸發器名,觸發器組名) * @param jobName 任務名 * @param time 新的時間設定 */ public static void modifyJobTime(String jobName, String time) { try { Scheduler sched = gSchedulerFactory.getScheduler(); //通過SchedulerFactory構建Scheduler物件 TriggerKey triggerKey = TriggerKey.triggerKey(jobName,TRIGGER_GROUP_NAME); //通過觸發器名和組名獲取TriggerKey CronTrigger trigger = (CronTrigger)sched.getTrigger(triggerKey); //通過TriggerKey獲取CronTrigger if (trigger == null) { return; } String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(time)) { JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); //通過任務名和組名獲取JobKey JobDetail jobDetail = sched.getJobDetail(jobKey); Class<? extends Job> objJobClass = jobDetail.getJobClass(); removeJob(jobName); addJob(jobName, objJobClass, time); } } catch (Exception e) { throw new RuntimeException(e); } } /**修改一個任務的觸發時間 * @param triggerName 任務名稱 * @param triggerGroupName 傳過來的任務名稱 * @param time 更新后的時間規則 */ public static void modifyJobTime(String triggerName, String triggerGroupName, String time) { try { Scheduler sched = gSchedulerFactory.getScheduler(); //通過SchedulerFactory構建Scheduler物件 TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroupName); //通過觸發器名和組名獲取TriggerKey CronTrigger trigger = (CronTrigger)sched.getTrigger(triggerKey); //通過TriggerKey獲取CronTrigger if (trigger == null) return; CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(trigger.getCronExpression()); String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(time)) { trigger = (CronTrigger)trigger.getTriggerBuilder() //重新構建trigger .withIdentity(triggerKey) .withSchedule(scheduleBuilder) .withSchedule(CronScheduleBuilder.cronSchedule(time)) .build(); sched.rescheduleJob(triggerKey, trigger); //按新的trigger重新設定job執行 } } catch (Exception e) { throw new RuntimeException(e); } } /**移除一個任務(使用默認的任務組名,觸發器名,觸發器組名) * @param jobName 任務名稱 */ public static void removeJob(String jobName) { try { Scheduler sched = gSchedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(jobName,TRIGGER_GROUP_NAME); //通過觸發器名和組名獲取TriggerKey JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); //通過任務名和組名獲取JobKey sched.pauseTrigger(triggerKey); // 停止觸發器 sched.unscheduleJob(triggerKey);// 移除觸發器 sched.deleteJob(jobKey); // 洗掉任務 } catch (Exception e) { throw new RuntimeException(e); } } /**移除一個任務 * @param jobName 任務名 * @param jobGroupName 任務組名 * @param triggerName 觸發器名 * @param triggerGroupName 觸發器組名 */ public static void removeJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName) { try { Scheduler sched = gSchedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroupName); //通過觸發器名和組名獲取TriggerKey JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); //通過任務名和組名獲取JobKey sched.pauseTrigger(triggerKey); // 停止觸發器 sched.unscheduleJob(triggerKey);// 移除觸發器 sched.deleteJob(jobKey); // 洗掉任務 } catch (Exception e) { throw new RuntimeException(e); } } /** * 啟動所有定時任務 */ public static void startJobs() { try { Scheduler sched = gSchedulerFactory.getScheduler(); sched.start(); } catch (Exception e) { throw new RuntimeException(e); } } /** * 關閉所有定時任務 */ public static void shutdownJobs() { try { Scheduler sched = gSchedulerFactory.getScheduler(); if (!sched.isShutdown()) { sched.shutdown(); } } catch (Exception e) { throw new RuntimeException(e); } } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/300847.html
標籤:Java
