如何對quartz定時任務(wù)設(shè)置結(jié)束時間
quartz定時任務(wù)設(shè)置結(jié)束時間
在使用quartz時,使用cornTrigger再設(shè)置一個結(jié)束時間 endAt(“結(jié)束的時間”),實現(xiàn)在任務(wù)執(zhí)后自動銷毀任務(wù),在到了結(jié)束時間之后,job并不會留在內(nèi)存中,job是直接被delete掉,所以不擔(dān)心會有內(nèi)存滿的情況;
代碼:
//按新的cronExpression表達式構(gòu)建一個新的trigger trigger = TriggerBuilder.newTrigger() .withIdentity(triggerName, triggerGroupName) .withSchedule(scheduleBuilder) .endAt(endDate) .build();
附屬上查詢所有job代碼:
/** * 查詢所有的job */ public static void getAllJobs(){ try { Scheduler scheduler = sf.getScheduler(); for (String groupName : scheduler.getJobGroupNames()) { for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) { String jobName = jobKey.getName(); String jobGroup = jobKey.getGroup(); //get job's trigger List<Trigger> triggers = (List<Trigger>) scheduler.getTriggersOfJob(jobKey); Date nextFireTime = triggers.get(0).getNextFireTime(); System.out.println("[jobName] : " + jobName + " [groupName] : " + jobGroup + " - " + nextFireTime); } } } catch (Exception e) { e.printStackTrace(); } }
下面是完整的quartz工具類
import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.matchers.GroupMatcher; import qgs.framework.core.task.JobFactory; import qgs.framework.util.utilty.DateUtil; import java.text.ParseException; import java.util.Date; import java.util.List; /** * create by XXX on 2018/09/03 * 定時任務(wù)工具類 */ public class QuartzUtil { private static SchedulerFactory sf = new StdSchedulerFactory(); private static JobFactory jobFactory = new JobFactory(); private static String JOB_GROUP_NAME = "group1"; private static String TRIGGER_GROUP_NAME = "trigger1"; /** * 添加一個定時任務(wù),使用默認的任務(wù)組名,觸發(fā)器名,觸發(fā)器組名 * * @param jobName 任務(wù)名 * @param jobClass 任務(wù)類名 * @param time 時間設(shè)置,參考quartz說明文檔 * @param data 定時任務(wù)所帶參數(shù)數(shù)據(jù) * @param endDate 定時任務(wù)生命周期結(jié)束時間 * @throws ParseException */ public static void saveJobCron(String jobName, Class<? extends Job> jobClass, String time, JobDataMap data, Date endDate) throws Exception { saveJobCron(jobName, JOB_GROUP_NAME, jobName, TRIGGER_GROUP_NAME, jobClass, time, data, endDate); } /** * 添加一個定時任務(wù),使用默認的任務(wù)組名,觸發(fā)器名,觸發(fā)器組名 * * @param jobName 任務(wù)名 * @param jobClass 任務(wù)類名 * @param time 時間設(shè)置,參考quartz說明文檔 * @throws ParseException */ public static void saveJobCron(String jobName, Class<? extends Job> jobClass, String time) throws Exception { saveJobCron(jobName, JOB_GROUP_NAME, jobName, TRIGGER_GROUP_NAME, jobClass, time); } /** */ /** * 添加一個定時任務(wù),使用默認的任務(wù)組名,觸發(fā)器名,觸發(fā)器組名 * * @param jobName 任務(wù)名 * @param jobClass 任務(wù)類名 * @param time 時間間隔 每隔多少時間執(zhí)行一次 單位毫秒 如 1000*60*60 = 1小時 * @throws ParseException */ public static void saveJobSimple(String jobName, Class<? extends Job> jobClass, Integer time) throws Exception { saveJobSimple(jobName, JOB_GROUP_NAME, jobName, TRIGGER_GROUP_NAME, jobClass, time, true); } public static void saveJobSimple(String jobName, Class<? extends Job> jobClass, Integer time, boolean firstRun) throws Exception { saveJobSimple(jobName, JOB_GROUP_NAME, jobName, TRIGGER_GROUP_NAME, jobClass, time, firstRun); } /** */ /** * 添加一個定時任務(wù) * * @param jobName 任務(wù)名 * @param jobGroupName 任務(wù)組名 * @param triggerName 觸發(fā)器名 * @param triggerGroupName 觸發(fā)器組名 * @param jobClass 任務(wù)類名 * @param time 時間間隔 每隔多少時間執(zhí)行一次 單位秒 如 1000*60*60 = 1小時 * @throws SchedulerException * @throws ParseException * @throws ParseException */ public static void saveJobSimple(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class<? extends Job> jobClass, Integer time, boolean firstRun) throws Exception { Scheduler scheduler = sf.getScheduler(); scheduler.setJobFactory(jobFactory); TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName); SimpleTrigger trigger = (SimpleTrigger) scheduler.getTrigger(triggerKey); //不存在,創(chuàng)建一個 if (null == trigger) { JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build(); //按新的cronExpression表達式構(gòu)建一個新的trigger TriggerBuilder s = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName); if (!firstRun) { s.startAt(DateUtil.addSecond(new Date(), time)); } trigger = (SimpleTrigger) s.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(time).repeatForever()).build(); scheduler.scheduleJob(jobDetail, trigger); //啟動 if (!scheduler.isShutdown()) scheduler.start(); } else { // Trigger已存在,那么更新相應(yīng)的定時設(shè)置 //按新的cronExpression表達式重新構(gòu)建trigger trigger = trigger.getTriggerBuilder().withIdentity(triggerKey) .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(time).repeatForever()).build(); //按新的trigger重新設(shè)置job執(zhí)行 scheduler.rescheduleJob(triggerKey, trigger); } } /** * 添加一個定時任務(wù) * * @param jobName 任務(wù)名 * @param jobGroupName 任務(wù)組名 * @param triggerName 觸發(fā)器名 * @param triggerGroupName 觸發(fā)器組名 * @param jobClass 任務(wù)類名 * @param time 時間設(shè)置,參考quartz說明文檔 * @param data 對應(yīng)定時認為中所涉及的數(shù)據(jù) * @param endDate 定時任務(wù)周期結(jié)束時間 * @throws SchedulerException * @throws ParseException * @throws ParseException */ public static void saveJobCron(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class<? extends Job> jobClass, String time, JobDataMap data, Date endDate) throws Exception { Scheduler scheduler = sf.getScheduler(); scheduler.setJobFactory(jobFactory); TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); //不存在,創(chuàng)建一個 if (null == trigger) { JobDetail jobDetail = JobBuilder.newJob(jobClass) .withIdentity(jobName, jobGroupName) .setJobData(data) .build(); //表達式調(diào)度構(gòu)建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time); //按新的cronExpression表達式構(gòu)建一個新的trigger trigger = TriggerBuilder.newTrigger() .withIdentity(triggerName, triggerGroupName) .withSchedule(scheduleBuilder) .endAt(endDate) .build(); scheduler.scheduleJob(jobDetail, trigger); //啟動 if (!scheduler.isShutdown()) scheduler.start(); } else { // Trigger已存在,那么更新相應(yīng)的定時設(shè)置 //表達式調(diào)度構(gòu)建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time); //按新的cronExpression表達式重新構(gòu)建trigger trigger = trigger.getTriggerBuilder() .withIdentity(triggerKey) .withSchedule(scheduleBuilder) .startAt(new Date()) .endAt(endDate).build(); //按新的trigger重新設(shè)置job執(zhí)行 scheduler.rescheduleJob(triggerKey, trigger); } } /** * 添加一個定時任務(wù) * * @param jobName 任務(wù)名 * @param jobGroupName 任務(wù)組名 * @param triggerName 觸發(fā)器名 * @param triggerGroupName 觸發(fā)器組名 * @param jobClass 任務(wù)類名 * @param time 時間設(shè)置,參考quartz說明文檔 * @throws SchedulerException * @throws ParseException * @throws ParseException */ public static void saveJobCron(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class<? extends Job> jobClass, String time) throws Exception { Scheduler scheduler = sf.getScheduler(); scheduler.setJobFactory(jobFactory); TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); //不存在,創(chuàng)建一個 if (null == trigger) { JobDetail jobDetail = JobBuilder.newJob(jobClass) .withIdentity(jobName, jobGroupName) .build(); //表達式調(diào)度構(gòu)建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time); //按新的cronExpression表達式構(gòu)建一個新的trigger trigger = TriggerBuilder.newTrigger() .withIdentity(triggerName, triggerGroupName) .withSchedule(scheduleBuilder) .build(); scheduler.scheduleJob(jobDetail, trigger); //啟動 if (!scheduler.isShutdown()) scheduler.start(); } else { // Trigger已存在,那么更新相應(yīng)的定時設(shè)置 //表達式調(diào)度構(gòu)建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time); //按新的cronExpression表達式重新構(gòu)建trigger trigger = trigger.getTriggerBuilder().withIdentity(triggerKey) .withSchedule(scheduleBuilder).build(); //按新的trigger重新設(shè)置job執(zhí)行 scheduler.rescheduleJob(triggerKey, trigger); } } /** */ /** * 移除一個任務(wù)(使用默認的任務(wù)組名,觸發(fā)器名,觸發(fā)器組名) * * @param jobName * @throws SchedulerException */ public static void removeJob(String jobName) throws Exception { removeJob(jobName, JOB_GROUP_NAME, jobName, TRIGGER_GROUP_NAME); } /** */ /** * 移除一個任務(wù) * * @param jobName * @param jobGroupName * @param triggerName * @param triggerGroupName * @throws SchedulerException */ public static void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) throws Exception { Scheduler scheduler = sf.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); scheduler.pauseTrigger(triggerKey);// 停止觸發(fā)器 scheduler.unscheduleJob(triggerKey);// 移除觸發(fā)器 scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 刪除任務(wù) } public static void shutdownJobs() throws Exception { Scheduler scheduler = sf.getScheduler(); try { if (!scheduler.isShutdown()) { scheduler.shutdown(); } } catch (Exception e) { throw new RuntimeException(e); } } /** * 查詢所有的job */ public static void getAllJobs(){ try { Scheduler scheduler = sf.getScheduler(); for (String groupName : scheduler.getJobGroupNames()) { for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) { String jobName = jobKey.getName(); String jobGroup = jobKey.getGroup(); //get job's trigger List<Trigger> triggers = (List<Trigger>) scheduler.getTriggersOfJob(jobKey); Date nextFireTime = triggers.get(0).getNextFireTime(); System.out.println("[jobName] : " + jobName + " [groupName] : " + jobGroup + " - " + nextFireTime); } } } catch (Exception e) { e.printStackTrace(); } } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java?如何通過注解實現(xiàn)接口輸出時數(shù)據(jù)脫敏
這篇文章主要介紹了Java?如何通過注解實現(xiàn)接口輸出時數(shù)據(jù)脫敏,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12SpringBoot如何使用自定義注解實現(xiàn)接口限流
這篇文章主要介紹了SpringBoot如何使用自定義注解實現(xiàn)接口限流,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06Java數(shù)據(jù)結(jié)構(gòu)之鏈表(動力節(jié)點之Java學(xué)院整理)
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之鏈表(動力節(jié)點之Java學(xué)院整理)的相關(guān)資料,需要的朋友可以參考下2017-04-04使用Jenkins Pipeline自動化構(gòu)建發(fā)布Java項目的方法
這篇文章主要介紹了使用Jenkins Pipeline自動化構(gòu)建發(fā)布Java項目的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04JDK生成WebService客戶端代碼以及調(diào)用方式
WebService 是一種跨編程語言和跨操作系統(tǒng)平臺的遠程調(diào)用技術(shù),下面這篇文章主要給大家介紹了關(guān)于JDK生成WebService客戶端代碼以及調(diào)用方式的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-08-08idea 實現(xiàn)git rebase操作應(yīng)用場景
本文結(jié)合idea工具進行rebase的各種場景的操作,借助工具更能直觀地觀察到分支之間地操作差異,方便我們理解rebase的各種操作以及場景的使用,對idea git rebase操作知識感興趣的朋友一起看看吧2024-01-01關(guān)于MyBatis結(jié)果映射的實例總結(jié)
結(jié)果集映射主要是為了解決屬性名和類型名不一致的問題,下面這篇文章主要給大家介紹了關(guān)于MyBatis結(jié)果映射的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-05-05