定时任务在springboot中的集成非常简单。
在一些博客中说到需要在启动类中加入@EnableScheduling注解来开启定时任务,其实这是不需要的。
@EnableScheduling 注解的作用是发现注解@Scheduled的任务并后台执行,但是我没有加上这个也能发现定时任务。
我们直接创建实现定时任务的service即可:
@Component
public class ScheduledTest {
private static final Logger logger = LoggerFactory.getLogger(ScheduledTest.class);
@Scheduled(cron="0 0/1 * * * ?")
public void task1() {
// 间隔1分钟,执行任务
Thread current = Thread.currentThread();
logger.info("ScheduledTest.task1 :"+current.getId()+ ",name: "+current.getName());
}
@Scheduled(cron="0 0/1 * * * ?")
public void task2() {
// 间隔1分钟,执行任务
Thread current = Thread.currentThread();
logger.info("ScheduledTest.task2 :"+current.getId()+ ",name: "+current.getName());
}
}
@Scheduled 注解用于标注这个方法是一个定时任务的方法,有多种配置可选。
Springboot本身默认的执行方式是串行执行,也就是说无论有多少task,都是一个线程串行执行,并行需手动配置。
并行任务只需要实现SchedulingConfigurer类并重写其方法即可:
@Component
public class ScheduledTest implements SchedulingConfigurer {
private static final Logger logger = LoggerFactory.getLogger(ScheduledTest.class);
@Scheduled(cron="0 0/1 * * * ?")
public void task1() {
// 间隔1分钟,执行任务
Thread current = Thread.currentThread();
logger.info("ScheduledTest.task1 :"+current.getId()+ ",name: "+current.getName());
}
@Scheduled(cron="0 0/1 * * * ?")
public void task2() {
// 间隔1分钟,执行任务
Thread current = Thread.currentThread();
logger.info("ScheduledTest.task2 :"+current.getId()+ ",name: "+current.getName());
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 创建一个定长线程池,支持定时及周期性任务执行。
ScheduledExecutorService pool = Executors.newScheduledThreadPool(100);
taskRegistrar.setScheduler(pool);
}
}
此时再次启动程序,会发现任务使用的线程不是同一个。可以使用sleep()方法来看出效果。