当前位置: 代码网 > it编程>编程语言>Java > Spring @Scheduled的坑及解决

Spring @Scheduled的坑及解决

2024年08月02日 Java 我要评论
spring @scheduled的坑spring的定时任务有两个坑1.单线程执行,多个定时任务不能同时执行2.如果当前定时任务还没有结束,那么下一次定时任务的时间到了也不会触发。解决办法加上@ena

spring @scheduled的坑

spring的定时任务有两个坑

1.单线程执行,多个定时任务不能同时执行

2.如果当前定时任务还没有结束,那么下一次定时任务的时间到了也不会触发。

解决办法

加上@enableasync注解

@scheduled 定时任务不执行

排查代码中添加的定时任务步骤是否正确

  • 启动类上加 @enablescheduling 注解
  • 定时任务类上加@component
  • 定时方法上加@scheduled
  @scheduled(cron = "0 19 16 * * ?")
    public void cron() {
        log.info("定时任务开启:---");
    }

排查是否任务阻塞,如果定时任务出现异常阻塞后,将不会在次执行

解决:进行try…catch异常抛出

java中多个@scheduled定时器不执行

原因是:

@scheduled注解会在默认情况下以单线程的方式执行定时任务。

这个“单线程”指两个方面:

  • 如果一个定时任务执行时间大于其任务间隔时间,那么下一次将会等待上一次执行结束后再继续执行。
  • 如果多个定时任务在同一时刻执行,任务会依次执行。

为了让@scheduled效率更高,我们可以通过两种方法将定时任务变成多线程执行:

方法1、在启动类中配置taskscheduler线程池大小:

public taskscheduler taskscheduler() {
threadpooltaskscheduler taskscheduler = new threadpooltaskscheduler();
taskscheduler.setpoolsize(10);//不配置默认是1
return taskscheduler;
}

方法2、利用spring提供的@async注解和@enableasync注解

@component
@enableasync //开启异步支持
public class timedtask{
@async // 对某个方法进行异步执行
@scheduled(initialdelay = 1,fixeddelay=10000)//initialdelay 在容器启动后,延迟1毫秒再执行一次定时器
public void aa() {
//执行业务逻辑
}

@async
@scheduled(initialdelay = 1,fixeddelay=10000)//fixeddelay  以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,并间隔给定的时间后,执行下一次
public void bb() {
//执行业务逻辑
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com