1. 需求场景
在每天定时的需要去扫描数据库的info表,需要根据当前时间来判断当前活动的状态,需要用到@Scheduled定时任务,但是考虑到后期有可能会更改cron表达式,所以这边就做成了动态获取的状态
2. 创建定时任务表
create table patrol_job
(
cron_id bigint(20) not null auto_increment comment '定时任务id',
cron_name varchar(200) not null default '' comment '定时任务名称',
cron varchar(64) not null default '' comment '定时时间',
create_by varchar(64) not null default '' comment '创建者',
update_by varchar(64) not null default '' comment '更新者',
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP comment '更新时间',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP comment '创建时间',
primary key (cron_id)
) engine=innodb comment = '巡视定时任务表';
3. @Scheduled使用的注意步骤
@Configuration-->加载配置信息
@EnableScheduling-->开启定时任务
4.具体代码
@Slf4j
@Configuration
@EnableScheduling
public class SysMyTask implements SchedulingConfigurer {
public void myTaskMethod() {
log.info("巡视定时任务开始了 : {}", new Date());
// 定时任务逻辑
log.info("巡视定时任务结束了: {}", new Date());
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(() -> myTaskMethod(), triggerContext -> {
// 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
PatrolJob patrolJob = sysPatrolJobMapper.selectById(1);
if (patrolJob.getCron().isEmpty()) {
throw new RuntimeException("cron为空");
}
CronTrigger cronTrigger = new CronTrigger(patrolJob.getCron());
Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);
return nextExecutionTime;
});
}
}
注意点:
cron在动态获取的时候,不会实时去加载你新的cron表达式,而是在下一次执行之前的任务,才会记录到最新的cron表达式,所以在这一块,需要注意一点