本文将用测试代码验证:定时任务阻塞问题。
在springboot中使用定时任务的步骤
-
在启动类上加上注解:
@EnableScheduling
,表示允许定时任务执行 -
定时任务需要在类上加上
@Component
或者其衍生类(Controller、Service等),用于纳入Spring容器管理。 -
在需要定时任务方法上增加注解
@Scheduled
,注解的参数是定时任务执行时机
首先需要知道:定时任务默认是单线程的。所以默认情况下,上一个定时任务没有执行完,下一个定时任务是不会开始的。
单线程定时任务
1. 示例1,最简单的例子
// 示例代码:最简单的定时任务
@Scheduled(cron = "0/1 * * * * ?")
public void test1() {
// 每秒执行一次
System.out.println("scheduler1 执行: " + Thread.currentThread() + "-" + DateTime.now());
}
如上方法,定时任务是每隔1s触发一次。
2. 示例2,验证定时任务阻塞
但是如果定时任务执行时间超过1s,下一个定时任务会被阻塞,直到上一个定时任务被执行完。
// 示例代码:验证定时任务阻塞问题
@Scheduled(cron = "0/1 * * * * ?")
public void test1() {
// 每秒执行一次
System.out.println("scheduler1 执行: " + Thread.currentThread() + "-" + DateTime.now());
try {
Thread.sleep(5*1000); // 5s
} catch (Exception e) {
System.out.println(e.toString());
}
}