開始使用
如果您剛開始使用 Spring Cloud Task,您應該閱讀本節。在此,我們回答基本的「是什麼?」「如何?」「為什麼?」等問題。我們先從 Spring Cloud Task 的簡要介紹開始。然後,我們將建置一個 Spring Cloud Task 應用程式,並在過程中討論一些核心原則。
開發您的第一個 Spring Cloud Task 應用程式
一個好的起點是從簡單的「Hello, World!」應用程式開始,因此我們建立 Spring Cloud Task 的等效應用程式,以突顯框架的功能。大多數 IDE 都對 Apache Maven 提供良好的支援,因此我們將其用作此專案的建置工具。
spring.io 網站包含許多 使用 Spring Boot 的「Getting Started 」指南。如果您需要解決特定問題,請先查看那裡。您可以前往 Spring Initializr 並建立新專案,以簡化以下步驟。這樣做會自動產生新的專案結構,讓您可以立即開始編碼。我們建議您試用 Spring Initializr 以熟悉它。 |
使用 Spring Initializr 建立 Spring Task 專案
現在我們可以建立並測試一個將 Hello, World!
印到主控台的應用程式。
若要執行此操作
-
請造訪 Spring Initialzr 網站。
-
建立一個新的 Maven 專案,群組名稱為
io.spring.demo
,成品名稱為helloworld
。 -
在「Dependencies」(相依性) 文字方塊中,輸入
task
,然後選取帶有Spring Cloud
標籤的Task
相依性。 -
在「Dependencies」(相依性) 文字方塊中,輸入
h2
,然後選取帶有SQL
標籤的H2
相依性。 -
按一下 Generate Project (產生專案) 按鈕
-
-
解壓縮 helloworld.zip 檔案,並將專案匯入您慣用的 IDE。
撰寫程式碼
若要完成我們的應用程式,我們需要使用以下內容更新產生的 HelloworldApplication
,使其啟動 Task。
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.task.configuration.EnableTask;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableTask
public class HelloworldApplication {
@Bean
public ApplicationRunner applicationRunner() {
return new HelloWorldApplicationRunner();
}
public static void main(String[] args) {
SpringApplication.run(HelloworldApplication.class, args);
}
public static class HelloWorldApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("Hello, World!");
}
}
}
雖然看起來很小,但實際上有很多事情正在發生。如需 Spring Boot 特性的詳細資訊,請參閱 Spring Boot 參考文件。
現在我們可以開啟 src/main/resources
中的 application.properties
檔案。我們需要在 application.properties
中設定兩個屬性
-
application.name
:設定應用程式名稱 (會轉譯為任務名稱) -
logging.level
:將 Spring Cloud Task 的記錄層級設定為DEBUG
,以便檢視正在發生的情況。
以下範例顯示如何同時執行這兩項操作
logging.level.org.springframework.cloud.task=DEBUG
spring.application.name=helloWorld
Task 自動組態
當包含 Spring Cloud Task Starter 相依性時,Task 會自動組態所有 bean 以引導其功能。此組態的一部分會註冊 TaskRepository
及其基礎架構以供使用。
在我們的示範中,TaskRepository
使用內嵌的 H2 資料庫來記錄任務的結果。這個 H2 內嵌資料庫並非生產環境的實用解決方案,因為 H2 DB 會在任務結束後消失。但是,為了快速入門體驗,我們可以在我們的範例中使用它,並將儲存庫中更新的內容回顯到記錄檔中。在 組態 區段 (本文件稍後部分),我們將說明如何自訂 Spring Cloud Task 提供的組件組態。
當我們的範例應用程式執行時,Spring Boot 會啟動我們的 HelloWorldApplicationRunner
,並將我們的「Hello, World!」訊息輸出到標準輸出。TaskLifecycleListener
會在儲存庫中記錄任務的開始和任務的結束。
main 方法
main 方法是任何 Java 應用程式的進入點。我們的 main 方法委派給 Spring Boot 的 SpringApplication 類別。
ApplicationRunner
Spring 包含許多引導應用程式邏輯的方法。Spring Boot 提供了一種透過其 *Runner
介面 (CommandLineRunner
或 ApplicationRunner
) 以有組織的方式執行此操作的便利方法。行為良好的任務可以使用這兩個 runner 之一來引導任何邏輯。
任務的生命週期從 *Runner#run
方法執行之前到所有方法完成後才算結束。Spring Boot 允許應用程式使用多個 *Runner
實作,Spring Cloud Task 也是如此。
從 CommandLineRunner 或 ApplicationRunner 以外的機制引導的任何處理 (例如,透過使用 InitializingBean#afterPropertiesSet ) 都不會由 Spring Cloud Task 記錄。 |
執行範例
此時,我們的應用程式應該可以運作了。由於此應用程式是以 Spring Boot 為基礎,我們可以從命令列執行它,方法是從我們應用程式的根目錄使用 $ ./mvnw spring-boot:run
,如下列範例所示 (及其輸出)
$ mvn clean spring-boot:run
....... . . .
....... . . . (Maven log output here)
....... . . .
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.2.1)
2024-01-04T10:07:01.102-06:00 INFO 18248 --- [helloWorld] [ main] i.s.d.helloworld.HelloworldApplication : Starting HelloworldApplication using Java 21.0.1 with PID 18248 (/Users/dashaun/fun/dashaun/spring-cloud-task/helloworld/target/classes started by dashaun in /Users/dashaun/fun/dashaun/spring-cloud-task/helloworld)
2024-01-04T10:07:01.103-06:00 INFO 18248 --- [helloWorld] [ main] i.s.d.helloworld.HelloworldApplication : No active profile set, falling back to 1 default profile: "default"
2024-01-04T10:07:01.526-06:00 INFO 18248 --- [helloWorld] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2024-01-04T10:07:01.626-06:00 INFO 18248 --- [helloWorld] [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:3ad913f8-59ce-4785-bf8e-d6335dff6856 user=SA
2024-01-04T10:07:01.627-06:00 INFO 18248 --- [helloWorld] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2024-01-04T10:07:01.633-06:00 DEBUG 18248 --- [helloWorld] [ main] o.s.c.t.c.SimpleTaskAutoConfiguration : Using org.springframework.cloud.task.configuration.DefaultTaskConfigurer TaskConfigurer
2024-01-04T10:07:01.633-06:00 DEBUG 18248 --- [helloWorld] [ main] o.s.c.t.c.DefaultTaskConfigurer : No EntityManager was found, using DataSourceTransactionManager
2024-01-04T10:07:01.639-06:00 DEBUG 18248 --- [helloWorld] [ main] o.s.c.t.r.s.TaskRepositoryInitializer : Initializing task schema for h2 database
2024-01-04T10:07:01.772-06:00 DEBUG 18248 --- [helloWorld] [ main] o.s.c.t.r.support.SimpleTaskRepository : Creating: TaskExecution{executionId=0, parentExecutionId=null, exitCode=null, taskName='helloWorld', startTime=2024-01-04T10:07:01.757268, endTime=null, exitMessage='null', externalExecutionId='null', errorMessage='null', arguments=[]}
2024-01-04T10:07:01.785-06:00 INFO 18248 --- [helloWorld] [ main] i.s.d.helloworld.HelloworldApplication : Started HelloworldApplication in 0.853 seconds (process running for 1.029)
Hello, World!
2024-01-04T10:07:01.794-06:00 DEBUG 18248 --- [helloWorld] [ main] o.s.c.t.r.support.SimpleTaskRepository : Updating: TaskExecution with executionId=1 with the following {exitCode=0, endTime=2024-01-04T10:07:01.787112, exitMessage='null', errorMessage='null'}
2024-01-04T10:07:01.799-06:00 INFO 18248 --- [helloWorld] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2024-01-04T10:07:01.806-06:00 INFO 18248 --- [helloWorld] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
....... . . .
....... . . . (Maven log output here)
....... . . .
先前的輸出中有三行是我們在這裡感興趣的
-
SimpleTaskRepository
記錄了TaskRepository
中項目的建立。 -
我們
ApplicationRunner
的執行,由「Hello, World!」輸出示範。 -
SimpleTaskRepository
記錄了TaskRepository
中任務的完成。
簡單的任務應用程式可以在 Spring Cloud Task 專案的範例模組中找到 這裡。 |