spring框架内的定时任务(Scheduled)同步和异步执行

之前写的一个定时任务,频率一秒一次,常执行。

里面的业务代码比较复杂,有DB查询、DB更新和插入、有嵌套循环、还有调用图片处理的程序等等,放服务器上跑,大概40分钟,就吃掉很多内存,占比85%,再跑下去JVM就越界,导致内存溢出,服务器就启动自我保护自动重启了。

然后就开始排查程序,为什么在JAVA自动回收的情况下,还会把服务器玩坏,突然想到了定时任务的机制问题。

Spring的定时器:@Scheduled(cron = "0/1 * * * * ?"),默认是同步的还是异步的?因为业务代码的复杂性,单次执行往往要超过一秒,如果定时器是异步执行的,也就是说我上一次代码还没有跑完,下一次执行就开始了,时间长了,就会白给。如果是同步执行,下一次执行需要等待上一次执行完毕,那就不会出现,按照情况来说,我一开始认为我的内存溢出问题,就是定时器异步导致的。于是我做了实验。

默认测试:

@Service
@Lazy(false)
public class TestController {

    @Scheduled(cron = "0/1 * * * * ?") // 间隔1秒
    protected void executeTask() {
        try{
        for (int i = 0; i < 5; i++) {
            System.out.println("i=" + i);
            Thread.sleep(1000);
        }
        } catch (In
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值