如何對(duì)quartz定時(shí)任務(wù)設(shè)置結(jié)束時(shí)間
quartz定時(shí)任務(wù)設(shè)置結(jié)束時(shí)間
在使用quartz時(shí),使用cornTrigger再設(shè)置一個(gè)結(jié)束時(shí)間 endAt(“結(jié)束的時(shí)間”),實(shí)現(xiàn)在任務(wù)執(zhí)后自動(dòng)銷毀任務(wù),在到了結(jié)束時(shí)間之后,job并不會(huì)留在內(nèi)存中,job是直接被delete掉,所以不擔(dān)心會(huì)有內(nèi)存滿的情況;
代碼:
//按新的cronExpression表達(dá)式構(gòu)建一個(gè)新的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
* 定時(shí)任務(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";
/**
* 添加一個(gè)定時(shí)任務(wù),使用默認(rèn)的任務(wù)組名,觸發(fā)器名,觸發(fā)器組名
*
* @param jobName 任務(wù)名
* @param jobClass 任務(wù)類名
* @param time 時(shí)間設(shè)置,參考quartz說(shuō)明文檔
* @param data 定時(shí)任務(wù)所帶參數(shù)數(shù)據(jù)
* @param endDate 定時(shí)任務(wù)生命周期結(jié)束時(shí)間
* @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);
}
/**
* 添加一個(gè)定時(shí)任務(wù),使用默認(rèn)的任務(wù)組名,觸發(fā)器名,觸發(fā)器組名
*
* @param jobName 任務(wù)名
* @param jobClass 任務(wù)類名
* @param time 時(shí)間設(shè)置,參考quartz說(shuō)明文檔
* @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);
}
/** */
/**
* 添加一個(gè)定時(shí)任務(wù),使用默認(rèn)的任務(wù)組名,觸發(fā)器名,觸發(fā)器組名
*
* @param jobName 任務(wù)名
* @param jobClass 任務(wù)類名
* @param time 時(shí)間間隔 每隔多少時(shí)間執(zhí)行一次 單位毫秒 如 1000*60*60 = 1小時(shí)
* @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);
}
/** */
/**
* 添加一個(gè)定時(shí)任務(wù)
*
* @param jobName 任務(wù)名
* @param jobGroupName 任務(wù)組名
* @param triggerName 觸發(fā)器名
* @param triggerGroupName 觸發(fā)器組名
* @param jobClass 任務(wù)類名
* @param time 時(shí)間間隔 每隔多少時(shí)間執(zhí)行一次 單位秒 如 1000*60*60 = 1小時(shí)
* @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)建一個(gè)
if (null == trigger) {
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
//按新的cronExpression表達(dá)式構(gòu)建一個(gè)新的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);
//啟動(dòng)
if (!scheduler.isShutdown())
scheduler.start();
} else {
// Trigger已存在,那么更新相應(yīng)的定時(shí)設(shè)置
//按新的cronExpression表達(dá)式重新構(gòu)建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(time).repeatForever()).build();
//按新的trigger重新設(shè)置job執(zhí)行
scheduler.rescheduleJob(triggerKey, trigger);
}
}
/**
* 添加一個(gè)定時(shí)任務(wù)
*
* @param jobName 任務(wù)名
* @param jobGroupName 任務(wù)組名
* @param triggerName 觸發(fā)器名
* @param triggerGroupName 觸發(fā)器組名
* @param jobClass 任務(wù)類名
* @param time 時(shí)間設(shè)置,參考quartz說(shuō)明文檔
* @param data 對(duì)應(yīng)定時(shí)認(rèn)為中所涉及的數(shù)據(jù)
* @param endDate 定時(shí)任務(wù)周期結(jié)束時(shí)間
* @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)建一個(gè)
if (null == trigger) {
JobDetail jobDetail =
JobBuilder.newJob(jobClass)
.withIdentity(jobName, jobGroupName)
.setJobData(data)
.build();
//表達(dá)式調(diào)度構(gòu)建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
//按新的cronExpression表達(dá)式構(gòu)建一個(gè)新的trigger
trigger = TriggerBuilder.newTrigger()
.withIdentity(triggerName, triggerGroupName)
.withSchedule(scheduleBuilder)
.endAt(endDate)
.build();
scheduler.scheduleJob(jobDetail, trigger);
//啟動(dòng)
if (!scheduler.isShutdown())
scheduler.start();
} else {
// Trigger已存在,那么更新相應(yīng)的定時(shí)設(shè)置
//表達(dá)式調(diào)度構(gòu)建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
//按新的cronExpression表達(dá)式重新構(gòu)建trigger
trigger = trigger.getTriggerBuilder()
.withIdentity(triggerKey)
.withSchedule(scheduleBuilder)
.startAt(new Date())
.endAt(endDate).build();
//按新的trigger重新設(shè)置job執(zhí)行
scheduler.rescheduleJob(triggerKey, trigger);
}
}
/**
* 添加一個(gè)定時(shí)任務(wù)
*
* @param jobName 任務(wù)名
* @param jobGroupName 任務(wù)組名
* @param triggerName 觸發(fā)器名
* @param triggerGroupName 觸發(fā)器組名
* @param jobClass 任務(wù)類名
* @param time 時(shí)間設(shè)置,參考quartz說(shuō)明文檔
* @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)建一個(gè)
if (null == trigger) {
JobDetail jobDetail =
JobBuilder.newJob(jobClass)
.withIdentity(jobName, jobGroupName)
.build();
//表達(dá)式調(diào)度構(gòu)建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
//按新的cronExpression表達(dá)式構(gòu)建一個(gè)新的trigger
trigger = TriggerBuilder.newTrigger()
.withIdentity(triggerName, triggerGroupName)
.withSchedule(scheduleBuilder)
.build();
scheduler.scheduleJob(jobDetail, trigger);
//啟動(dòng)
if (!scheduler.isShutdown())
scheduler.start();
} else {
// Trigger已存在,那么更新相應(yīng)的定時(shí)設(shè)置
//表達(dá)式調(diào)度構(gòu)建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
//按新的cronExpression表達(dá)式重新構(gòu)建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
.withSchedule(scheduleBuilder).build();
//按新的trigger重新設(shè)置job執(zhí)行
scheduler.rescheduleJob(triggerKey, trigger);
}
}
/** */
/**
* 移除一個(gè)任務(wù)(使用默認(rèn)的任務(wù)組名,觸發(fā)器名,觸發(fā)器組名)
*
* @param jobName
* @throws SchedulerException
*/
public static void removeJob(String jobName) throws Exception {
removeJob(jobName, JOB_GROUP_NAME, jobName, TRIGGER_GROUP_NAME);
}
/** */
/**
* 移除一個(gè)任務(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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot中使用Quartz設(shè)置定時(shí)任務(wù)的實(shí)例詳解
- Springboot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)代碼實(shí)例
- SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)
- Springboot整合quartz實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)實(shí)例
- SpringBoot+Quartz實(shí)現(xiàn)定時(shí)任務(wù)的代碼模版分享
- Quartz定時(shí)任務(wù)管理方式(動(dòng)態(tài)添加、停止、恢復(fù)、刪除定時(shí)任務(wù))
相關(guān)文章
Java?如何通過(guò)注解實(shí)現(xiàn)接口輸出時(shí)數(shù)據(jù)脫敏
這篇文章主要介紹了Java?如何通過(guò)注解實(shí)現(xiàn)接口輸出時(shí)數(shù)據(jù)脫敏,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot如何使用自定義注解實(shí)現(xiàn)接口限流
這篇文章主要介紹了SpringBoot如何使用自定義注解實(shí)現(xiàn)接口限流,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Java數(shù)據(jù)結(jié)構(gòu)之鏈表(動(dòng)力節(jié)點(diǎn)之Java學(xué)院整理)
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之鏈表(動(dòng)力節(jié)點(diǎn)之Java學(xué)院整理)的相關(guān)資料,需要的朋友可以參考下2017-04-04
用攔截器修改返回response,對(duì)特定的返回進(jìn)行修改操作
這篇文章主要介紹了用攔截器修改返回response,對(duì)特定的返回進(jìn)行修改操作。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
使用Jenkins Pipeline自動(dòng)化構(gòu)建發(fā)布Java項(xiàng)目的方法
這篇文章主要介紹了使用Jenkins Pipeline自動(dòng)化構(gòu)建發(fā)布Java項(xiàng)目的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
JDK生成WebService客戶端代碼以及調(diào)用方式
WebService 是一種跨編程語(yǔ)言和跨操作系統(tǒng)平臺(tái)的遠(yuǎn)程調(diào)用技術(shù),下面這篇文章主要給大家介紹了關(guān)于JDK生成WebService客戶端代碼以及調(diào)用方式的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
idea 實(shí)現(xiàn)git rebase操作應(yīng)用場(chǎng)景
本文結(jié)合idea工具進(jìn)行rebase的各種場(chǎng)景的操作,借助工具更能直觀地觀察到分支之間地操作差異,方便我們理解rebase的各種操作以及場(chǎng)景的使用,對(duì)idea git rebase操作知識(shí)感興趣的朋友一起看看吧2024-01-01
關(guān)于MyBatis結(jié)果映射的實(shí)例總結(jié)
結(jié)果集映射主要是為了解決屬性名和類型名不一致的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于MyBatis結(jié)果映射的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05

