SpringBoot定时任务自定义实现
1. 注解方式实现
暂不讨论(很容易,但很死板,无法动态添加或删除);
2. 自定义实现
- org.springframework.scheduling.annotation.EnableScheduling
该注解类接口的注释中有自定义实现SpringBoot的示例代码
@Configuration
@EnableScheduling
public class AppConfig implements SchedulingConfigurer {
private ScheduledTaskRegistrar taskRegistrar;
public ScheduledTaskRegistrar getTaskRegistrar() {
return taskRegistrar;
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskScheduler());
taskRegistrar.addTriggerTask(
new Runnable() {
public void run() {
myTask().work();
}
},
new CustomTrigger()
);
}
@Bean(destroyMethod="shutdown")
public Executor taskScheduler() {
return Executors.newScheduledThreadPool(42);
}
@Bean
public MyTask myTask() {
return new MyTask();
}
}
该示例代码实现了添加自定义的任务,但和注解方式实现一样,程序运行后就马上加载了
- org.springframework.scheduling.config.ScheduledTaskRegistrar
Helper bean for registering tasks with a TaskScheduler, typically using cron expressions.
帮助bean向TaskScheduler注册任务,通常使用cron表达式。
初始化时可以使用下面的方法添加任务
/**
* Add a Runnable task to be triggered per the given {@link Trigger}.
* @see TaskScheduler#scheduleAtFixedRate(Runnable, long)
*/
public void addTriggerTask(Runnable task, Trigger trigger) {
addTriggerTask(new TriggerTask(task, trigger));
}
/**
* Add a {@code TriggerTask}.
* @since 3.2
* @see TaskScheduler#scheduleAtFixedRate(Runnable, long)
*/
public void addTriggerTask(TriggerTask task) {
if (this.triggerTasks == null) {
this.triggerTasks = new ArrayList<>();
}
this.triggerTasks.add(task);
}
/**
* Add a {@link Runnable} task to be triggered per the given cron {@code expression}.
* <p>As of Spring Framework 5.2, this method will not register the task if the
* {@code expression} is equal to {@link #CRON_DISABLED}.
*/
public void addCronTask(Runnable task, String expression) {
if (!CRON_DISABLED.equals(expression)) {
addCronTask(new CronTask(task, expression));
}
}
/**
* Add a {@link CronTask}.
* @since 3.2
*/
public void addCronTask(CronTask task) {
if (this.cronTasks == null) {
this.cronTasks = new ArrayList<>();
}
this.cronTasks.add(task);
}
/**
* Add a {@code Runnable} task to be triggered at the given fixed-rate interval.
* @see TaskScheduler#scheduleAtFixedRate(Runnable, long)
*/
public void addFixedRateTask(Runnable task, long interval) {
addFixedRateTask(new IntervalTask(task, interval, 0));
}
/**
* Add a fixed-rate {@link IntervalTask}.
* @since 3.2
* @see TaskScheduler#scheduleAtFixedRate(Runnable, long)
*/
public void addFixedRateTask(IntervalTask task) {
if (this.fixedRateTasks == null) {
this.fixedRateTasks = new ArrayList<>();
}
this.fixedRateTasks.add(task);
}
/**
* Add a Runnable task to be triggered with the given fixed delay.
* @see TaskScheduler#scheduleWithFixedDelay(Runnable, long)
*/
public void addFixedDelayTask(Runnable task, long delay) {
addFixedDelayTask(new IntervalTask(task, delay, 0));
}
/**
* Add a fixed-delay {@link IntervalTask}.
* @since 3.2
* @see TaskScheduler#scheduleWithFixedDelay(Runnable, long)
*/
public void addFixedDelayTask(IntervalTask task) {
if (this.fixedDelayTasks == null) {
this.fixedDelayTasks = new ArrayList<>();
}
this.fixedDelayTasks.add(task);
}
运行中添加任务使用
/**
* Schedule the specified trigger task, either right away if possible
* or on initialization of the scheduler.
* @return a handle to the scheduled task, allowing to cancel it
* @since 4.3
*/
@Nullable
public ScheduledTask scheduleTriggerTask(TriggerTask task) {
...
}
/**
* Schedule the specified cron task, either right away if possible
* or on initialization of the scheduler.
* @return a handle to the scheduled task, allowing to cancel it
* (or {@code null} if processing a previously registered task)
* @since 4.3
*/
@Nullable
public ScheduledTask scheduleCronTask(CronTask task) {
...
}
/**
* Schedule the specified fixed-rate task, either right away if possible
* or on initialization of the scheduler.
* @return a handle to the scheduled task, allowing to cancel it
* (or {@code null} if processing a previously registered task)
* @since 5.0.2
*/
@Nullable
public ScheduledTask scheduleFixedRateTask(FixedRateTask task) {
...
}
/**
* Schedule the specified fixed-delay task, either right away if possible
* or on initialization of the scheduler.
* @return a handle to the scheduled task, allowing to cancel it
* (or {@code null} if processing a previously registered task)
* @since 4.3
* @deprecated as of 5.0.2, in favor of {@link #scheduleFixedDelayTask(FixedDelayTask)}
*/
/**
* Schedule the specified fixed-delay task, either right away if possible
* or on initialization of the scheduler.
* @return a handle to the scheduled task, allowing to cancel it
* (or {@code null} if processing a previously registered task)
* @since 5.0.2
*/
@Nullable
public ScheduledTask scheduleFixedDelayTask(FixedDelayTask task) {
...
}
运行过程中使用add方法添加的任务不会执行,如果强行使用方法:org.springframework.scheduling.config.ScheduledTaskRegistrar.afterPropertiesSet
之前运行的任务会再次被调度执行,导致多个线程同时在执行同一个任务的混乱情况
- 示例
@RestController
@RequestMapping("/task")
public class TestTaskApi {
private Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
AppConfig taskConfig;
@RequestMapping("/add")
public String add(String cron){
ScheduledTaskRegistrar taskRegistrar = taskConfig.getTaskRegistrar();
taskRegistrar.scheduleCronTask(new CronTask(() -> {
log.error("执行[" + cron + "]");
}, cron));
return cron;
}
}
cron表达式
A cron-like expression, extending the usual UN*X definition to include triggers on the second, minute, > > > hour, day of month, month, and day of week.
For example, "0 * * * * MON-FRI" means once per minute on weekdays (at the top of the minute - the 0th > second).
The fields read from left to right are interpreted as follows.
second
minute
hour
day of month
month
day of week
The special value "-" indicates a disabled cron trigger, primarily meant for externally specified values > > > > resolved by a ${...} placeholder.