springboot 中 定时器的坑

今天由于使用springboot中的定时器触发任务,定义了一个全局变量,获取当前时间,定时器用在方法上开启定时任务

启动类文件中 只需添加下开启定时任务就行。

@SpringBootApplication
@EnableScheduling //定时器开启
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

由于项目是跑在服务器中,第一次用springboot中的定时器,当时定义的是获取当前时间,

@Component
public class Test {
    ZonedDateTime today=ZonedDateTime.now();
    
    @Scheduled(cron = "0/20 * * * * ? ")//每隔20秒走一次方法
    public void test() {
        System.out.println(today);
    }
}

虽然知道 这样定义的是全局变量,随着类的加载和结束而销毁,问题就在于这个,当方法调用时,类是不会再加载的,所以获取的当前时间,永远都是第一次类加载时,所获取的时间

这个是我打印的当前时间,永远都会是一个,除非重启springboot,本来想的是 在类中定义会减少开销,不用每次都创建 ,现在才懂springboot 走的是方法,而不是调用方法时再次加载全局变量,

记录下。

2020-07-16T20:50:46.607107100+08:00[Asia/Shanghai]
2020-07-16T20:50:46.607107100+08:00[Asia/Shanghai]
2020-07-16T20:50:46.607107100+08:00[Asia/Shanghai]
2020-07-16T20:50:46.607107100+08:00[Asia/Shanghai]
2020-07-16T20:50:46.607107100+08:00[Asia/Shanghai]
2020-07-16T20:50:46.607107100+08:00[Asia/Shanghai]

如果想要实时获取当前时间,是要定义成局部变量,随着方法销毁,而销毁,方法的执行而创建。应该改为这种

@Component
public class Test {
    @Scheduled(cron = "0/20 * * * * ? ")//每隔20秒执行一次
    public void test() {
        ZonedDateTime today=ZonedDateTime.now();//定义在方法中,局部变量。
        System.out.println(today);
    }
}

这种才是想要的效果,以此记录下,希望能够帮到 有点迷惑的人。

2020-07-16T20:55:20.004566700+08:00[Asia/Shanghai]
2020-07-16T20:55:40.002115300+08:00[Asia/Shanghai]
2020-07-16T20:56:00.001650300+08:00[Asia/Shanghai]

posted @ 2020-07-16 20:57  勤奋的小蜜蜂1号  阅读(1409)  评论(0编辑  收藏  举报