博主的公众号:Java4y
《《《《《《《《《
一个努力提高工作效率(增加摸鱼时间)的小白博主
》》》》》》》》》》
关注有惊喜哦
《《《《《《《《《
2021一起好好加油! (ง •_•)ง
Springboot+quartz 动态定时任务的核心方法
创建 Job 继承 QuartzJobBean
/**
* @author Java4ye
* @date 2021/2/8 21:11
* @微信公众号: Java4ye
* @GitHub https://github.com/RyzeYang
* @博客 https://blog.csdn.net/weixin_40251892
*/
@Slf4j
public class HelloWorldJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext){
log.info("HelloWorld");
JobKey key = jobExecutionContext.getJobDetail().getKey();
log.info("[JobKey] name:{},group:{}",key.getName(),key.getGroup());
}
}
创建 JobKey
private JobKey getJobKey(String jobClassName, String jobGroupName) {
return JobKey.jobKey(jobClassName, jobGroupName);
}
创建 TriggerKey
private TriggerKey getTriggerKey(String jobClassName, String jobGroupName) {
return TriggerKey.triggerKey(jobClassName, jobGroupName);
}
创建 JobDetail
/**
* 获取 JobDetail
*
* @param jobClassName Job Class
* @param jobKey JobKey
* @return
* @throws ClassNotFoundException
*/
private JobDetail getJobDetail(String jobClassName, JobKey jobKey) throws ClassNotFoundException {
Class<?> jobClass = Class.forName(jobClassName);
return JobBuilder.newJob((Class<? extends Job>) jobClass)
.withIdentity(jobKey)
.build();
}
创建 CronScheduleBuilder
/**
* 获取 CronScheduleBuilder
*
* @param cronExpression cron表达式
* @return
*/
private CronScheduleBuilder getCronScheduleBuilder(String cronExpression) {
if (CronExpression.isValidExpression(cronExpression)) {
return CronScheduleBuilder.cronSchedule(cronExpression);
} else {
throw new RuntimeException("不是cron表达式");
}
}
创建 CronTrigger
/**
* 创建 触发器 Trigger
*
* @param jobDetail job
* @param triggerKey triggerKey
* @param cronScheduleBuilder cron
* @return
* @throws ClassNotFoundException
*/
private CronTrigger getCronTrigger(JobDetail jobDetail, TriggerKey triggerKey, CronScheduleBuilder cronScheduleBuilder) throws ClassNotFoundException {
return TriggerBuilder.newTrigger()
.forJob(jobDetail)
.withIdentity(triggerKey)
.withSchedule(cronScheduleBuilder)
.build();
}
保存 Job
/**
* 添加新的 Job 到scheduler中
* @throws ClassNotFoundException
* @throws SchedulerException
*/
private void addScheduler() throws ClassNotFoundException, SchedulerException {
scheduler.start();
JobKey jobKey = getJobKey(jobClassName, jobGroupName);
JobDetail jobDetail1 = scheduler.getJobDetail(jobKey);
if (jobDetail1 != null) {
throw new SchedulerException("重复");
}
JobDetail jobDetail = getJobDetail(jobClassName, jobKey);
CronScheduleBuilder cronScheduleBuilder = getCronScheduleBuilder(cronExpression);
TriggerKey triggerKey = getTriggerKey(jobClassName, jobGroupName);
CronTrigger cronTrigger = getCronTrigger(jobDetail, triggerKey, cronScheduleBuilder);
scheduler.scheduleJob(jobDetail, cronTrigger);
}
删除,暂停,恢复,立即执行,更新 Job
// 删除 JOb
scheduler.deleteJob(getJobKey(jobClassName,jobGroupName));
// 暂停 JOb
scheduler.pauseJob(getJobKey(jobClassName,jobGroupName));
// 恢复 Job
scheduler.resumeJob(getJobKey(jobClassName,jobGroupName));
// 立即执行Job
scheduler.triggerJob(getJobKey(jobClassName,jobGroupName));
TriggerKey triggerKey = getTriggerKey(jobClassName, jobGroupName);
JobKey jobKey = getJobKey(jobClassName, jobGroupName);
JobDetail jobDetail = getJobDetail(jobClassName, jobKey);
// 更新 Job
scheduler.rescheduleJob(
triggerKey,
getCronTrigger(jobDetail, triggerKey, getCronScheduleBuilder(cronExpression))
);
cron 表达式
字段 | 允许值 | 允许的特殊字符 |
---|---|---|
秒 | 0-59 | , – * / |
分 | 0-59 | , – * / |
小时 | 0-23 | , – * / |
日期 | 1-31 | , – * ? / L W C |
月份 | 1-12或者 JAN-DEC | , – * / |
星期 | 1-7或者 SUN-SAT | , – * ? / L C # |
年(可选) | 留空, 1970-2099 | , – * / |
常用表达式例子
(1)0/2 * * * * ? 表示每2秒 执行任务
(1)0 0/2 * * * ? 表示每2分钟 执行任务
(1)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务
(2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业
(3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
(4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
(5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
(6)0 0 12 ? * WED 表示每个星期三中午12点
(7)0 0 12 * * ? 每天中午12点触发
(8)0 15 10 ? * * 每天上午10:15触发
(9)0 15 10 * * ? 每天上午10:15触发
(10)0 15 10 * * ? 每天上午10:15触发
(11)0 15 10 * * ? 2005 2005年的每天上午10:15触发
(12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
(13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
(14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
(15)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
(16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
(17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
(18)0 15 10 15 * ? 每月15日上午10:15触发
(19)0 15 10 L * ? 每月最后一日的上午10:15触发
(20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
(21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
(22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
在线Cron表达式生成器 :
https://www.bejson.com/othertools/cron/