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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM