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]