作者:时光-Goslow | 来源:互联网 | 2023-06-03 13:24
定时任务与异步任务定时任务springboot提供了对定时任务的支持,只需要通过注解开启定时任务即可,用法很简单,下面介绍一下几个注意问题;@EnableScheduling@Co
定时任务与异步任务
定时任务
springboot提供了对定时任务的支持,只需要通过注解开启定时任务即可,用法很简单,下面介绍一下几个注意问题;
@EnableScheduling
@Component
@Slf4j
public class RaadFileTask {
@Autowired
private LogDetailService detailService;
@Value("${log.file.path1}")
String filePath;
@Scheduled(cron = "0 10 0/1 * * ?")
private void readLogFile() throws ParseException {
log.info("读日志文件");
detailService.readLogByFile(filePath);
}
}
与Quartz的区别:
- spring的@Scheduled注解cron只允许配置6位,即没有第七位年的配置
- 在周几的位置spring中1-7表示周一到周日,或者MON-SUN,而Quartz中则1表示周日,2表示周一,以此类推
定时任务阻塞问题:
定时任务默认是阻塞的,即定时任务会等待一个任务完成才能执行下一个,即定时任务是单线程的,根据业务需求,我们更希望它是非阻塞的,严格按照我们配置的方式执行
- 可以通过多线程方式让业务方法异步执行
- spring支持定时任务线程池,查看定时任务的自动配置类TaskSchedulingAutoConfiguration,可以发现默认线程池配置的大小为1,可以通过配置修改:spring.task.scheduling.pool.size=5
但是此配置在有些版本不生效,不建议使用 - 由spring提供的异步任务方式,让定时任务异步执行
异步任务
spring提供的对异步任务的支持,只需要两个注解,这样我们就不用自己再去手动将任务提交给线程池了
- @EnableAsync:开启异步任务功能
- @Async:标注在需要异步执行的方法上
这个异步任务其实也是交给一个线程池来处理,异步任务的自动配置类为:TaskExecutionAutoConfiguration
属性绑定在TaskExecutionProperties,可以看到默认配置的coreSize是8,最大配置和队列的配置都是Integer的最大值,这个是不合理的,所以我们可以通过配置文件修改这些配置
spring.task.execution.pool.core-size=10
spring.task.execution.max-size=200
所以我们再使用线程池的时候,也可以直接注入这个线程池 TaskExecutorBuilder
解决: 使用异步+定时任务来完成定时任务不阻塞(不执行)的功能