Spring Batch 是一個輕量級、全面的批次框架,旨在支援開發對企業系統日常營運至關重要的健全批次應用程式。 Spring Batch 建立在人們從 Spring 框架中了解的生產力、基於 POJO 的開發方法和一般易用性功能的基礎上,同時使開發人員在必要時可以輕鬆存取和利用更高級的企業服務。
如果您正在為 Batch 應用程式尋找執行時間編排工具,或者需要管理控制台來查看目前和歷史執行情況,請查看 Spring Cloud Data Flow。它是一個編排工具,用於部署和執行基於資料整合的微服務,包括 Spring Batch 應用程式。
這個快速教學向您展示如何設定一個最小的項目來使用 Spring Batch 運行簡單的批次作業。
在您最喜歡的 IDE 中,建立一個新的基於 Maven 的 Java 17+ 專案並新增以下相依性:
< dependencies >
< dependency >
< groupId >org.springframework.batch</ groupId >
< artifactId >spring-batch-core</ artifactId >
< version >${LATEST_VERSION}</ version >
</ dependency >
< dependency >
< groupId >org.hsqldb</ groupId >
< artifactId >hsqldb</ artifactId >
< version >${LATEST_VERSION}</ version >
< scope >runtime</ scope >
</ dependency >
</ dependencies >
然後,建立一個配置類別來定義作業儲存庫將使用的資料來源和事務管理器:
import javax . sql . DataSource ;
import org . springframework . context . annotation . Bean ;
import org . springframework . context . annotation . Configuration ;
import org . springframework . jdbc . support . JdbcTransactionManager ;
import org . springframework . jdbc . datasource . embedded . EmbeddedDatabaseBuilder ;
@ Configuration
public class DataSourceConfiguration {
@ Bean
public DataSource dataSource () {
return new EmbeddedDatabaseBuilder ()
. addScript ( "/org/springframework/batch/core/schema-hsqldb.sql" )
. build ();
}
@ Bean
public JdbcTransactionManager transactionManager ( DataSource dataSource ) {
return new JdbcTransactionManager ( dataSource );
}
}
在本教學中,使用 Spring Batch 的元資料表建立並初始化嵌入式 HSQLDB 資料庫。
最後,建立一個類別來定義批次作業:
import org . springframework . batch . core . Job ;
import org . springframework . batch . core . JobParameters ;
import org . springframework . batch . core . Step ;
import org . springframework . batch . core . configuration . annotation . EnableBatchProcessing ;
import org . springframework . batch . core . job . builder . JobBuilder ;
import org . springframework . batch . core . launch . JobLauncher ;
import org . springframework . batch . core . repository . JobRepository ;
import org . springframework . batch . core . step . builder . StepBuilder ;
import org . springframework . batch . repeat . RepeatStatus ;
import org . springframework . context . ApplicationContext ;
import org . springframework . context . annotation . AnnotationConfigApplicationContext ;
import org . springframework . context . annotation . Bean ;
import org . springframework . context . annotation . Configuration ;
import org . springframework . context . annotation . Import ;
import org . springframework . jdbc . support . JdbcTransactionManager ;
@ Configuration
@ EnableBatchProcessing
@ Import ( DataSourceConfiguration . class )
public class HelloWorldJobConfiguration {
@ Bean
public Step step ( JobRepository jobRepository , JdbcTransactionManager transactionManager ) {
return new StepBuilder ( "step" , jobRepository ). tasklet (( contribution , chunkContext ) -> {
System . out . println ( "Hello world!" );
return RepeatStatus . FINISHED ;
}, transactionManager ). build ();
}
@ Bean
public Job job ( JobRepository jobRepository , Step step ) {
return new JobBuilder ( "job" , jobRepository ). start ( step ). build ();
}
public static void main ( String [] args ) throws Exception {
ApplicationContext context = new AnnotationConfigApplicationContext ( HelloWorldJobConfiguration . class );
JobLauncher jobLauncher = context . getBean ( JobLauncher . class );
Job job = context . getBean ( Job . class );
jobLauncher . run ( job , new JobParameters ());
}
}
本教程中的作業由列印「Hello world!」的單一步驟組成。到標準輸出。
現在您可以執行HelloWorldJobConfiguration
類別的main
方法來啟動作業。輸出應類似以下內容:
INFO: Finished Spring Batch infrastructure beans configuration in 8 ms.
INFO: Starting embedded database: url='jdbc:hsqldb:mem:testdb', username='sa'
INFO: No database type set, using meta data indicating: HSQL
INFO: No Micrometer observation registry found, defaulting to ObservationRegistry.NOOP
INFO: No TaskExecutor has been set, defaulting to synchronous executor.
INFO: Job: [SimpleJob: [name=job]] launched with the following parameters: [{}]
INFO: Executing step: [step]
Hello world!
INFO: Step: [step] executed in 10ms
INFO: Job: [SimpleJob: [name=job]] completed with the following parameters: [{}] and the following status: [COMPLETED] in 25ms
本指南是一個更實際的教程,展示了一個典型的 ETL 批次作業,該作業從平面檔案讀取資料、轉換資料並將其寫入關聯式資料庫。它是一個基於Spring Boot的Spring Batch專案。您可以在此處找到入門指南:建立批次服務。
您可以在此處找到幾個可供嘗試的範例:Spring Batch Samples。
如果您有疑問或支援請求,請在 GitHub 討論上開啟新討論或在 StackOverflow 上提出問題。
請不要在問題追蹤器上針對問題或支援請求建立問題。我們希望保留問題追蹤器專門用於錯誤報告和功能請求。
Spring Batch 使用 GitHub Issues 來記錄錯誤和功能請求。如果您想提出問題,請遵循以下建議:
對於重要的錯誤,請建立一個測試案例或複製問題的項目並將其附加到問題中,如問題報告指南中詳述。
請參閱我們的安全政策。
使用 Github 主頁上的 URL 複製 git 儲存庫:
$ git clone [email protected]:spring-projects/spring-batch.git
$ cd spring-batch
Maven 是用於 Spring Batch 的建置工具。您可以使用以下命令建置專案:
$ ./mvnw package
如果您想執行包含所有集成測試的完整構建,請運行:
$ ./mvnw verify
請注意,一些整合測試是基於 Docker,因此請確保在運行完整建置之前已啟動並執行 Docker。
若要產生參考文檔,請執行以下命令:
$ cd spring-batch-docs
$ ../mvnw antora:antora
參考文檔可以在spring-batch-docs/target/anotra/site
中找到。
如果您想在 Docker 容器中建置項目,可以依照下列步驟操作:
$> docker run -it --mount type=bind,source="$(pwd)",target=/spring-batch maven:3-openjdk-17 bash
#> cd spring-batch
#> ./mvnw package
這將安裝您先前在容器內的主機上複製的原始程式碼。如果您想在容器內處理原始程式碼的副本(對主機沒有副作用),您可以依照下列步驟操作:
$> docker run -it maven:3-openjdk-17 bash
#> git clone https://github.com/spring-projects/spring-batch.git
#> cd spring-batch
#> ./mvnw package
我們歡迎任何形式的貢獻!您可以透過以下幾種方式為該專案做出貢獻:
在我們接受拉取請求之前,我們需要您簽署貢獻者協議。簽署貢獻者協議並不授予任何人對主儲存庫的提交權,但這確實意味著我們可以接受您的貢獻,如果我們這樣做,您將獲得作者信用。活躍的貢獻者可能會被要求加入核心團隊,並被賦予合併拉取請求的能力。
請參閱我們的行為準則。
Spring Batch 是在 Apache 2.0 許可證下發布的開源軟體。