排程任務
本指南將指導你完成使用Spring排程任務的步驟。
將要構建什麼
你將構建一個應用程式,使用Spring的@Scheduled
註解每五秒列印一次當前時間。
需要什麼
- 大約15分鐘
- 最喜歡的文字編輯器或IDE
- JDK 1.8或更高版本
- Gradle 4+或Maven 3.2+
-
你還可以將程式碼直接匯入IDE:
- Spring Tool Suite(STS)
- IntelliJ IDEA
如何完成本指南
請執行以下操作:
-
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