SpringBoot使用@Scheduled註解實現定時任務

前言

這周總算是找到了狀態,天天有時間就敲敲代碼,感受充實了好多,也正由於這種狀態,才使得我順利達到了上次彙報確立的目標,同時讓我感慨的,就是目標的重要性,若是沒有明確的目標,項目想要順利往下進行着實有點難。
以前寫的登陸組件都是按照教程寫的,因此打算提升一下,寫點教程上沒有的,雖然說也得去各類博客上查吧,因而選擇了自動推送功能的開發。html

實踐

博客上寫了好多關於實現自動任務的方法,我就選擇了比較簡單的一種,畢竟有的複雜到還要下載SQL文件,數據表多達十幾個,暫時也不知道要不要記錄推送任務執行狀況,因此選擇了Spring自帶的@Scheduled註解方法。
首先就是聲明依賴:java

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

以後使用MVN安裝依賴便可web

而後在啓動類上添加@EnableScheduling註解spring

SpringBootApplication
@EnableAsync  // 啓用異步
@ServletComponentScan
@EnableScheduling        // 啓用定時任務
public class LogApplication {

    public static void main(String[] args) {
        SpringApplication.run(LogApplication.class, args);
    }

}

以後就是新建java類,添加方法便可,在本項目中,新建timingtask文件夾,新建pushTask.java做爲定時任務實現類文件tomcat

@Component
public class pushTask {
    Date currentTime = new Date();
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String dateString = formatter.format(currentTime);
    //
    @Scheduled(cron = "${time.cron}")
    public void runTask(){
        System.out.println("執行定時任務" + dateString);
    }
}

@component (把pushTask實例化到spring容器中)
@scheduled (用來開啓定時任務)
corn裏面寫的是執行的時間,這裏把時間信息放到了配置文件中:異步

time:
  cron: 0 0 8 ? * *

corn有着本身的語法,像上面就是天天上午八點執行自動任務
cron表達式詳解
在線Cron表達式生成器
@Scheduled註解下的方法即是自動執行的方法。spring-boot

問題

下面以執行時間在12:57:50的方法爲例
查看後臺日誌信息:測試

2020-03-20 12:57:24.120  INFO 22826 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8114 (http) with context path ''
2020-03-20 12:57:24.121  INFO 22826 --- [           main] club.yunzhi.log.LogApplication           : Started LogApplication in 2.635 seconds (JVM running for 3.022)
執行定時任務2020-03-20 12:57:23

方法執行的時間與主機上的時間相同,可是對於SpringBoot獲取的時間戳來講,時間上仍是有差距的,並且每次差距都不一樣。日誌

解決

後來添加了一個按秒執行的方法run()code

@Scheduled(cron="*/${time.interval} * * * * *")
    void run() {
        System.out.println("每五秒執行 " + dateString);
    }

配置文件

time:
  #特定時間
  cron: 50 05 13 ? * *
  #間隔秒數
  interval: 5

而後看一下日誌信息:

2020-03-20 13:14:46.330  INFO 28915 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8114 (http) with context path ''
2020-03-20 13:14:46.332  INFO 28915 --- [           main] club.yunzhi.log.LogApplication           : Started LogApplication in 2.607 seconds (JVM running for 3.029)
每五秒執行 2020-03-20 13:14:45
每五秒執行 2020-03-20 13:14:45
每五秒執行 2020-03-20 13:14:45
每五秒執行 2020-03-20 13:14:45

發現時間戳都是同樣的,後來我看了一下主機時間,發現原來時間戳的時間是程序啓動的時間,並非隨時獲取的時間。

總結

至於成不成功,還要通過許多測試才能下結論,以後打算結合宇軒開發的機器人測試一下定時任務,看狀況再改進。

參考文檔

@Scheduled註解各參數詳解
spring boot 幾種定時任務的實現方式
SpringBoot2.0集成Quartz

相關文章
相關標籤/搜索