SpringBoot创建定时任务的三种方式
一、基于Cron表达式创建
SpringBoot提供了@Schedule标签来创建定时任务,用此标签创建的定时任务为单线程,如果有多个定时任务,使用的是一个线程来执行的。具体使用如下:
// 1.开启配置注解,使得spring能够扫描
@Configuration
// 2.开启定时任务
@EnableScheduling
public class SaticScheduleTask {
//3.添加定时任务
@Scheduled(cron = "0/5 * * * * ?")
//或直接指定时间间隔,例如:5秒
//@Scheduled(fixedRate=5000)
private void configureTasks() {
System.out.println("定时任务执行时间: " + LocalDateTime.now());
}
}
- 注:@Scheduled:除了支持灵活的参数表达式cron之外,还支持简单的延时操作,例如 fixedDelay ,fixedRate 填写相应的毫秒数即可。
二、基于异步多线程创建
SpringBoot提供了@EnableAsync和@Async两个注解来创建异步多线程任务。具体用法如下:
@Component
// 1.开启定时任务
@EnableScheduling
// 2.开启多线程
@EnableAsync
public class MultithreadScheduleTask {
@Async
@Scheduled(fixedDelay = 1000) //间隔1秒
public void first() throws InterruptedException {
System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
System.out.println();
Thread.sleep(1000 * 10);
}
@Async
@Scheduled(fixedDelay = 2000) //间隔2秒
public void second() {
System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
System.out.println();
}
}
- 注意:@Async注解是开启异步任务的关键
三、自定义配置创建
有时候实际开发场景中可能需要动态的根据数据库的信息来改变动态添加不同类型的定时任务,这时候就需要我们手动实现Spring 提供的SchedulingConfigurer 类来自定义定时任务。具体用法如下:
@Configuration
@EnableScheduling
public class AlarmTiming implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
FixedDelayTask fixedDelayTask = new FixedDelayTask(() -> {
System.out.println("手动定时任务");
}, 10000, 1000);
taskRegistrar.addFixedDelayTask(fixedDelayTask);
}
}
实现configureTasks方法后,我们可以在实际的业务逻辑里边注入对应的configuer,然后调用configureTasks,传入自定义的taskRegistrar即可。上边是一个简单的示例,实际开发中最好将配置和业务逻辑分开。