解决定时任务不执行与阻塞

定时任务与异步任务

定时任务

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的区别:

  1. spring的@Scheduled注解cron只允许配置6位,即没有第七位年的配置
  2. 在周几的位置spring中1-7表示周一到周日,或者MON-SUN,而Quartz中则1表示周日,2表示周一,以此类推

定时任务阻塞问题:

定时任务默认是阻塞的,即定时任务会等待一个任务完成才能执行下一个,即定时任务是单线程的,根据业务需求,我们更希望它是非阻塞的,严格按照我们配置的方式执行

  1. 可以通过多线程方式让业务方法异步执行
  2. spring支持定时任务线程池,查看定时任务的自动配置类TaskSchedulingAutoConfiguration,可以发现默认线程池配置的大小为1,可以通过配置修改:spring.task.scheduling.pool.size=5
    但是此配置在有些版本不生效,不建议使用
  3. 由spring提供的异步任务方式,让定时任务异步执行

异步任务

spring提供的对异步任务的支持,只需要两个注解,这样我们就不用自己再去手动将任务提交给线程池了

  • @EnableAsync:开启异步任务功能
  • @Async:标注在需要异步执行的方法上

这个异步任务其实也是交给一个线程池来处理,异步任务的自动配置类为:TaskExecutionAutoConfiguration

属性绑定在TaskExecutionProperties,可以看到默认配置的coreSize是8,最大配置和队列的配置都是Integer的最大值,这个是不合理的,所以我们可以通过配置文件修改这些配置

spring.task.execution.pool.core-size=10
spring.task.execution.max-size=200

所以我们再使用线程池的时候,也可以直接注入这个线程池 TaskExecutorBuilder

解决: 使用异步+定时任务来完成定时任务不阻塞(不执行)的功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值