今天由於使用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]