自定義Quartz超實用工具類
1.添加maven依賴
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
2.實現(xiàn)Quartz實用工具類
/**
* Quartz任務調(diào)度器工具類
*
* @author CatalpaFlat
* @date Create in 10:25 2017/11/16
*/
public class QuartzUtil {
/**
* 調(diào)度器工廠
*/
private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
/**
* 默認Job組名
*/
private static String JOB_GROUP_NAME = "DEFAULT_JOB_GROUP_NAME";
/**
* 默認觸發(fā)器組名
*/
private static String TRIGGER_GROUP_NAME = "DEFAULT_TRIGGER_GROUP_NAME";
/**
* 獲取調(diào)度器
*
* @return Scheduler
* @throws SchedulerException Scheduler獲取異常
*/
private static Scheduler getScheduler() throws SchedulerException {
return schedulerFactory.getScheduler();
}
/**
* 獲取CronTrigger
*
* @param jobName 任務名
* @param triggerGroupName 觸發(fā)器組名(為空使用默認)
* @param time crond格式時間
* @return CronTrigger
*/
private static CronTrigger getCronTrigger(String jobName, String triggerGroupName, String time) {
if (StringUtils.isBlank(triggerGroupName)) {
triggerGroupName = TRIGGER_GROUP_NAME;
}
return TriggerBuilder.newTrigger().withIdentity(jobName, triggerGroupName)
.withSchedule(CronScheduleBuilder.cronSchedule(time)).build();
}
/**
* 獲取JobDetail
*
* @param jobName 任務名
* @param jobGroupName 任務組名(為空使用默認)
* @param cls 任務類
* @param jobDataMap 附帶參數(shù)
* @return JobDetail
*/
private static JobDetail getJobDetail(String jobName, String jobGroupName, Class<? extends Job> cls, JobDataMap jobDataMap) {
if (StringUtils.isBlank(jobGroupName)) {
jobGroupName = JOB_GROUP_NAME;
}
if (jobDataMap != null) {
return JobBuilder.newJob(cls).withIdentity(jobName, jobGroupName).usingJobData(jobDataMap).build();
} else {
return JobBuilder.newJob(cls).withIdentity(jobName, jobGroupName).build();
}
}
/**
* 設置JobDetail 和 CronTrigger 到 scheduler(已獲取的調(diào)度器中驰坊,無需重復調(diào)用)
*
* @param cls 任務嘞
* @param jobName 任務名
* @param jobGroupName 任務組名(為空使用默認)
* @param triggerGroupName 觸發(fā)器組名(為空使用默認)
* @param time crond格式時間
* @param jobDataMap 附帶參數(shù)
* @param scheduler 調(diào)度器
* @return 設置成功與否
* @throws SchedulerException 調(diào)度器異常
*/
private static boolean setJobDetailAndCronTriggerInScheduler(Class<? extends Job> cls, String jobName, String jobGroupName, String triggerGroupName,
String time, JobDataMap jobDataMap, Scheduler scheduler) throws SchedulerException {
if (!isJobKey(scheduler, jobName, jobGroupName)) {
return false;
}
JobDetail jobDetail = getJobDetail(jobName, jobGroupName, cls, jobDataMap);
CronTrigger trigger = getCronTrigger(jobName, triggerGroupName, time);
scheduler.scheduleJob(jobDetail, trigger);
if (!scheduler.isShutdown()) {
scheduler.start();
}
return true;
}
/**
* 從調(diào)度器中移除Job
*
* @param scheduler 調(diào)度器
* @param triggerKey 觸發(fā)器key(名翘鸭,組)
* @param jobKey 任務key(名窒典,組)
*/
private static void removeJob(Scheduler scheduler, TriggerKey triggerKey, JobKey jobKey) {
try {
// 停止觸發(fā)器
scheduler.pauseTrigger(triggerKey);
//移除觸發(fā)器
scheduler.unscheduleJob(triggerKey);
// 刪除任務
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 使用CronTrigger類型添加任務
*
* @param scheduler 調(diào)度器
* @param cls 任務嘞
* @param jobName 任務名
* @param jobGroupName 任務組名(為空使用默認)
* @param triggerGroupName 觸發(fā)器組名(為空使用默認)
* @param time crond格式時間
* @param jobDataMap 附帶參數(shù)
* @return 是否添加成功
*/
private static boolean addJobByCronTrigger(Scheduler scheduler, Class<? extends Job> cls, String jobName, String jobGroupName,
String triggerGroupName, String time, JobDataMap jobDataMap) {
try {
return setJobDetailAndCronTriggerInScheduler(cls, jobName, jobGroupName, triggerGroupName, time, jobDataMap, scheduler);
} catch (SchedulerException e) {
e.printStackTrace();
return false;
}
}
/**
* 判斷是否存在JobKey
*
* @param scheduler 任務調(diào)度器
* @param jobName 任務名
* @param jobGroupName 任務組名
* @return 是否存在JobKey
*/
private static boolean isJobKey(Scheduler scheduler, String jobName, String jobGroupName) {
JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
try {
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
return jobDetail == null;
} catch (SchedulerException e) {
e.printStackTrace();
return false;
}
}
/**
* 添加定時任務
*
* @param cls 任務類
* @param jobName 任務名
* @param jobGroupName 任務組名(為空使用默認)
* @param triggerGroupName 觸發(fā)器組名(為空使用默認)
* @param time crond格式時間
* @param jobDataMap 附帶參數(shù)
* @return 是否正常添加任務
*/
public static boolean addJobByCronTrigger(Class<? extends Job> cls, String jobName, String jobGroupName,
String triggerGroupName, String time, JobDataMap jobDataMap) {
try {
if (StringUtils.isBlank(jobName)) {
return false;
}
Scheduler scheduler = getScheduler();
return setJobDetailAndCronTriggerInScheduler(cls, jobName, jobGroupName, triggerGroupName, time, jobDataMap, scheduler);
} catch (SchedulerException e) {
e.printStackTrace();
return false;
}
}
/**
* 修改任務時間
*
* @param jobName 任務名
* @param time crond格式時間
* @param jobGroupName 任務組名(為空使用默認)
* @param triggerGroupName 觸發(fā)器組名(為空使用默認)
* @param jobDataMap 附帶參數(shù)
* @return 是否修改成功
*/
public static boolean modifyJobTime(String jobName, String time, String jobGroupName,
String triggerGroupName, JobDataMap jobDataMap) {
try {
if (StringUtils.isBlank(jobName)) {
return false;
}
Scheduler scheduler = getScheduler();
if (StringUtils.isBlank(triggerGroupName)) {
triggerGroupName = TRIGGER_GROUP_NAME;
}
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
if (trigger == null) {
return false;
}
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(time)) {
if (StringUtils.isBlank(jobGroupName)) {
jobGroupName = JOB_GROUP_NAME;
}
JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
Class<? extends Job> jobClass = jobDetail.getJobClass();
removeJob(scheduler, triggerKey, jobKey);
return addJobByCronTrigger(scheduler, jobClass, jobName, jobGroupName, triggerGroupName, time, jobDataMap);
}
return true;
} catch (SchedulerException e) {
e.printStackTrace();
return false;
}
}
/**
* 啟動所有定時任務
*/
public static void startJobs() {
try {
Scheduler scheduler = getScheduler();
scheduler.start();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 關閉所有定時任務
*/
public static void shutdownJobs() {
try {
Scheduler scheduler = getScheduler();
if (!scheduler.isShutdown()) {
scheduler.shutdown();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 停止一個job任務
*
* @param jobName 任務名
* @param jobGroupName 任務組名(空位默認)
* @return 是否停止
*/
public static boolean pauseJob(String jobName, String jobGroupName) {
try {
Scheduler scheduler = getScheduler();
if (StringUtils.isBlank(jobGroupName)) {
jobGroupName = JOB_GROUP_NAME;
}
scheduler.interrupt(JobKey.jobKey(jobName, jobGroupName));
return true;
} catch (SchedulerException e) {
e.printStackTrace();
return false;
}
}
/**
* 恢復一個job任務
*
* @param jobName 任務名
* @param jobGroupName 任務組名(空位默認)
* @return 是否恢復
*/
public static boolean resumeJob(String jobName, String jobGroupName) {
try {
Scheduler scheduler = getScheduler();
scheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName));
return true;
} catch (SchedulerException e) {
e.printStackTrace();
return false;
}
}
/**
* 添加定時任務
*
* @param cls 任務類
* @param bJob 任務類屬性
* @return 是否添加成功
*/
public static boolean addJobByCronTrigger(Class<? extends Job> cls, BaseJob bJob) {
if (bJob == null) {
return false;
}
String jobName = bJob.getJobName();
if (StringUtils.isBlank(jobName)) {
return false;
}
try {
Scheduler scheduler = getScheduler();
return setJobDetailAndCronTriggerInScheduler(cls, jobName, bJob.getJobGroupName(), bJob.getTriggerGroupName(), bJob.getCronTime(), bJob.getJobDataMap(), scheduler);
} catch (SchedulerException e) {
e.printStackTrace();
return false;
}
}
/**
* 修改任務JobDateMap
*
* @param cls 任務類
* @param bJob 任務類屬性
* @return 是否修改成功
*/
public static boolean modifyJobDateMap(Class<? extends Job> cls, BaseJob bJob) {
if (bJob == null) {
return false;
}
String jobName = bJob.getJobName();
if (StringUtils.isBlank(jobName)) {
return false;
}
String triggerGroupName = bJob.getTriggerGroupName();
if (StringUtils.isBlank(triggerGroupName)) {
triggerGroupName = TRIGGER_GROUP_NAME;
}
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName);
String jobGroupName = bJob.getJobGroupName();
if (StringUtils.isBlank(jobGroupName)) {
jobGroupName = JOB_GROUP_NAME;
}
try {
Scheduler scheduler = getScheduler();
JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
JobDetail jobDetail1 = scheduler.getJobDetail(jobKey);
if (jobDetail1 == null) {
return false;
}
JobDataMap oldJobDataMap = jobDetail1.getJobDataMap();
JobDataMap jobDataMap = bJob.getJobDataMap();
if (!oldJobDataMap.equals(jobDataMap)) {
Class<? extends Job> jobClass = jobDetail1.getJobClass();
removeJob(scheduler, triggerKey, jobKey);
return addJobByCronTrigger(scheduler, jobClass, jobName, jobGroupName, triggerGroupName, bJob.getCronTime(), jobDataMap);
}
return true;
} catch (SchedulerException e) {
e.printStackTrace();
return false;
}
}
}