SpringBoot 定时器 定时任务基于注解@Scheduled及 实现接口SchedulingConfigurer
1:注解(三种定时任务执行方式)
@Component
@EnableScheduling
@EnableAsync
@Slf4j
public class ScheduledJob {
private Logger logger = LoggerFactory.getLogger(ScheduledJob.class);
@Async //异步执行
@Scheduled(fixedDelay = 5 * 1000)
public void fixedDelay(){
logger.info("表示第一个任务执行结束,开始计时,过5秒后,开始第二次执行。");
}
@Scheduled(fixedDelay = 2 * 1000)
public void fixedRate(){
logger.info("表示第一个任务开始执行,开始计时,过2秒后,开始第二次执行。");
logger.info("弊端:对于单线程任务来讲,如果执行时间大于间隔时间,会导致程序阻塞,依次类推,后面会接连发生阻塞。");
}
@Async
@Scheduled(cron = " 0/1 * * * * ?")
public void corn(){
logger.info("每隔1秒执行一次");
}
}
2:SchedulingConfigurer实现方式
2.1、在启动类必须加上@EnableScheduling //开启定时任务
2.2、实现SchedulingConfigurer接口 并重写configureTasks方法
@Component
@Slf4j
public class WenTestJob2 implements SchedulingConfigurer {
private String cron = "0/1 * * * * ?";
private Logger logger = LoggerFactory.getLogger(WenTestJob2.class);
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addCronTask(new Runnable() {
@Override
public void run() {
logger.info("猪八戒吃西瓜");
}
},cron);
}
}
3:定时器的时间从配置文件获取
@Component
@PropertySource("classpath:runTast.yml") //classpath:跟resources下面的文件名
public class ConfigrationTest {
@Value("${order}")
private String order;
@Value("${haha}")
private String haha;
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
public String getHaha() {
return haha;
}
public void setHaha(String haha) {
this.haha = haha;
}
}