Spring 指南(排程任務)

博弈發表於2019-01-19

排程任務

本指南將指導你完成使用Spring排程任務的步驟。

將要構建什麼

你將構建一個應用程式,使用Spring的@Scheduled註解每五秒列印一次當前時間。

需要什麼

  • 大約15分鐘
  • 最喜歡的文字編輯器或IDE
  • JDK 1.8或更高版本
  • Gradle 4+Maven 3.2+
  • 你還可以將程式碼直接匯入IDE:

    • Spring Tool Suite(STS)
    • IntelliJ IDEA

如何完成本指南

請執行以下操作:

  • 下載並解壓縮本指南的源儲存庫,或使用Git克隆它:

    git clone https://github.com/spring-guides/gs-scheduling-tasks.git
  • 進入gs-scheduling-tasks/initial

完成後,你可以根據gs-scheduling-tasks/complete中的程式碼檢查結果。

建立排程任務

現在你已經設定了專案,可以建立排程任務。

src/main/java/hello/ScheduledTasks.java
package hello;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        log.info("The time is now {}", dateFormat.format(new Date()));
    }
}

Scheduled註解定義特定方法何時執行,注意:此示例使用fixedRate,它指定從每次呼叫的開始時間計算的方法呼叫之間的間隔。還有其他選項,例如fixedDelay,它指定從完成任務計算的呼叫之間的間隔,你還可以使用@Scheduled(cron=". . .")表示式進行更復雜的任務排程

啟用排程

雖然排程任務可以嵌入到Web應用程式和WAR檔案中,但下面演示的更簡單的方法建立了一個獨立的應用程式,將所有內容打包在一個可執行的JAR檔案中,由main()方法驅動。

src/main/java/hello/Application.java
package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class Application {

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

@SpringBootApplication是一個方便的註解,新增了以下所有內容:

  • @Configuration將類標記為應用程式上下文的bean定義源。
  • @EnableAutoConfiguration告訴Spring Boot根據類路徑設定、其他bean和各種屬性設定開始新增bean。
  • 通常你會為Spring MVC應用新增@EnableWebMvc,但Spring Boot會在類路徑上看到spring-webmvc時自動新增它,這會將應用程式標記為Web應用程式並啟用關鍵行為,例如設定DispatcherServlet
  • @ComponentScan告訴Spring在hello包中查詢其他元件、配置和服務,允許它找到控制器。

main()方法使用Spring Boot的SpringApplication.run()方法來啟動應用程式,你是否注意到沒有一行XML?也沒有web.xml檔案,此Web應用程式是100%純Java,你無需處理配置任何管道或基礎結構。

@EnableScheduling確保建立後臺任務執行程式,沒有它,就沒有任何排程。

構建可執行的JAR

你可以使用Gradle或Maven從命令列執行該應用程式,或者,你可以構建一個包含所有必需依賴項、類和資源的可執行JAR檔案,並執行它,這使得在整個開發生命週期中、跨不同環境等將服務作為應用程式釋出、版本和部署變得容易。

如果你使用的是Gradle,則可以使用./gradlew bootRun執行該應用程式,或者你可以使用./gradlew build構建JAR檔案,然後你可以執行JAR檔案:

java -jar build/libs/gs-scheduling-tasks-0.1.0.jar

如果你使用的是Maven,則可以使用./mvnw spring-boot:run執行該應用程式,或者你可以使用./mvnw clean package構建JAR檔案,然後你可以執行JAR檔案:

java -jar target/gs-scheduling-tasks-0.1.0.jar

上面的過程將建立一個可執行的JAR,你也可以選擇構建經典WAR檔案。

顯示日誌輸出,你可以從日誌中看到它在後臺執行緒上,你應該看到你的排程任務每5秒出發一次:

[...]
2016-08-25 13:10:00.143  INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:00
2016-08-25 13:10:05.143  INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:05
2016-08-25 13:10:10.143  INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:10
2016-08-25 13:10:15.143  INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:15

相關文章