springboot中schedule定时任务是一个线程管理的么

无论有多少个定时任务,都是由一个线程来管理。
验证办法:
如果是一个线程,不同的schedule之间会等待。 如果是多个线程,不同的schedule之间不会等待。

如下代码说明用法:

@SpringBootApplication
@EnableScheduling
public class AccessingDataMysqlApplication {
    public static void main(String[] args) {
        ApplicationContext app = SpringApplication.run(AccessingDataMysqlApplication.class, args);

    }
    @Scheduled(cron = "0/2 * * * * ?")
    public void schedule1(){
        try {
            System.out.println(Thread.currentThread().getName()+", 1 "+Instant.now());
            Thread.sleep(5000);
            System.out.println(Thread.currentThread().getName()+" 1 end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Scheduled(cron = "0/2 * * * * ?")
    public void schedule2(){
        try {
            System.out.println(Thread.currentThread().getName()+", 2  "+ Instant.now());
            Thread.sleep(5000);
            System.out.println(Thread.currentThread().getName()+" 2  end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

输出为:

pool-1-thread-1, 2  2020-02-08T14:21:46.001Z
pool-1-thread-1 2  end
pool-1-thread-1, 1 2020-02-08T14:21:51.002Z
pool-1-thread-1 1 end
pool-1-thread-1, 2  2020-02-08T14:21:56.002Z
pool-1-thread-1 2  end
pool-1-thread-1, 1 2020-02-08T14:22:01.003Z
pool-1-thread-1 1 end
pool-1-thread-1, 2  2020-02-08T14:22:06.076Z

如果是多线程,同序号线程应该5秒输出一次。
但是发现都收到影响了,所以定时任务是一个线程管理的。

定时任务中如何避免阻塞

定时任务往往被用于批量执行操作。 这里要注意定时任务是单线程的。 如果某个出现问题,后续的就无法继续执行。
方案:
对for循环中的每一条记录,单独进行try catch。使没一条数据都是独立的。 这样一条错误,不影响后续执行。

另外,如果某条错误记录被多次重复执行,会连续打印很多相同的错误日志。 这个可以加个重试字段来标记。

schedule定时任务还有考虑集群问题

例如2台机器,部署相同应用,如果不考虑调度,可能会将相同逻辑执行2遍,造成资源浪费甚至是错误数据。
所以集群中使用schedule任务一定要注意。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值