單步批處理作業啟動器
本節將介紹如何使用 Spring Cloud Task 中包含的啟動器,開發一個包含單個 Step 的 Spring Batch Job。此啟動器允許您透過配置定義 ItemReader、ItemWriter 或完整的單步 Spring Batch Job。有關 Spring Batch 及其功能的更多資訊,請參閱 Spring Batch 文件。
要獲取 Maven 啟動器,請將以下內容新增到您的構建中
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-single-step-batch-job</artifactId>
<version>2.3.0</version>
</dependency>
要獲取 Gradle 啟動器,請將以下內容新增到您的構建中
compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2.3.0"
定義作業
您可以使用啟動器來定義最少的 ItemReader 或 ItemWriter,或者定義完整的 Job。在本節中,我們將定義配置 Job 所需的屬性。
屬性
首先,啟動器提供了一組屬性,讓您可以配置包含一個 Step 的 Job 的基本資訊
| 財產 | 型別 | 預設值 | 描述 |
|---|---|---|---|
|
|
|
作業名稱。 |
|
|
|
步驟名稱。 |
|
|
|
每個事務處理的項數。 |
配置上述屬性後,您將擁有一個包含單個基於塊的步驟的作業。此基於塊的步驟讀取、處理並寫入 Map<String, Object> 例項作為項。但是,該步驟尚未執行任何操作。您需要配置一個 ItemReader、一個可選的 ItemProcessor 和一個 ItemWriter 以使其執行某些操作。要配置其中之一,您可以使用屬性並配置已提供自動配置的選項之一,或者您可以使用標準的 Spring 配置機制配置您自己的。
如果您配置自己的,則輸入和輸出型別必須與步驟中的其他型別匹配。此啟動器中的 ItemReader 實現和 ItemWriter 實現都使用 Map<String, Object> 作為輸入和輸出項。 |
ItemReader 實現的自動配置
此啟動器為四種不同的 ItemReader 實現提供了自動配置:AmqpItemReader、FlatFileItemReader、JdbcCursorItemReader 和 KafkaItemReader。在本節中,我們將概述如何使用提供的自動配置來配置這些實現。
AmqpItemReader
您可以使用 AmqpItemReader 從 AMQP 佇列或主題讀取資料。此 ItemReader 實現的自動配置取決於兩組配置。首先是 AmqpTemplate 的配置。您可以自己配置此項,也可以使用 Spring Boot 提供的自動配置。請參閱 Spring Boot AMQP 文件。配置 AmqpTemplate 後,您可以透過設定以下屬性來啟用批處理功能以支援它
| 財產 | 型別 | 預設值 | 描述 |
|---|---|---|---|
|
|
|
如果為 |
|
|
|
指示是否應註冊 |
有關更多資訊,請參閱 AmqpItemReader 文件。
FlatFileItemReader
FlatFileItemReader 允許您從平面檔案(例如 CSV 和其他檔案格式)讀取資料。要從檔案讀取資料,您可以透過正常的 Spring 配置(LineTokenizer、RecordSeparatorPolicy、FieldSetMapper、LineMapper 或 SkippedLinesCallback)自行提供一些元件。您還可以使用以下屬性配置讀取器
| 財產 | 型別 | 預設值 | 描述 |
|---|---|---|---|
|
|
|
確定是否應儲存狀態以進行重新啟動。 |
|
|
|
用於在 |
|
|
|
要從檔案中讀取的最大項數。 |
|
|
0 |
已讀取的項數。在重新啟動時使用。 |
|
|
空列表 |
指示檔案中註釋行(要忽略的行)的字串列表。 |
|
|
|
要讀取的資源。 |
|
|
|
如果設定為 |
|
|
|
讀取檔案時使用的編碼。 |
|
|
0 |
指示在檔案開頭要跳過的行數。 |
|
|
|
指示檔案是否為分隔檔案(CSV 和其他格式)。此屬性或 |
|
|
|
如果讀取分隔檔案,則指示要解析的分隔符。 |
|
|
|
用於確定用於引用值的字元。 |
|
|
空列表 |
用於確定記錄中要包含在項中的欄位的索引列表。 |
|
|
|
指示檔案的記錄是否按列號解析。此屬性或 |
|
|
空列表 |
用於解析固定寬度記錄的列範圍列表。請參閱 Range 文件。 |
|
|
|
從記錄中解析出的每個欄位的名稱列表。這些名稱是此 |
|
|
|
如果設定為 |
JdbcCursorItemReader
JdbcCursorItemReader 對關係資料庫執行查詢,並迭代結果遊標(ResultSet)以提供結果項。此自動配置允許您提供 PreparedStatementSetter、RowMapper 或兩者。您還可以使用以下屬性配置 JdbcCursorItemReader
| 財產 | 型別 | 預設值 | 描述 |
|---|---|---|---|
|
|
|
確定是否應儲存狀態以進行重新啟動。 |
|
|
|
用於在 |
|
|
|
要從檔案中讀取的最大項數。 |
|
|
0 |
已讀取的項數。在重新啟動時使用。 |
|
|
向驅動程式提供的提示,指示每次呼叫資料庫系統時要檢索的記錄數。為了獲得最佳效能,您通常希望將其設定為與塊大小匹配。 |
|
|
|
要從資料庫讀取的最大項數。 |
|
|
|
查詢超時前的毫秒數。 |
|
|
|
|
確定讀取器在處理時是否應忽略 SQL 警告。 |
|
|
|
指示是否應在每次讀取後驗證遊標位置,以驗證 |
|
|
|
指示驅動程式是否支援遊標的絕對定位。 |
|
|
|
指示連線是否與其他處理共享(因此是事務的一部分)。 |
|
|
|
要讀取的 SQL 查詢。 |
您還可以使用以下屬性專門為讀取器指定 JDBC DataSource:。JdbcCursorItemReader 屬性
| 財產 | 型別 | 預設值 | 描述 |
|---|---|---|---|
|
|
|
確定是否應啟用 |
|
|
|
資料庫的 JDBC URL。 |
|
|
|
資料庫的登入使用者名稱。 |
|
|
|
資料庫的登入密碼。 |
|
|
|
JDBC 驅動程式的完全限定名稱。 |
如果未指定 jdbccursoritemreader_datasource,則 JDBCCursorItemReader 將使用預設的 DataSource。 |
KafkaItemReader
從 Kafka 主題攝取分割槽資料非常有用,這正是 KafkaItemReader 可以做到的。要配置 KafkaItemReader,需要兩部分配置。首先,需要使用 Spring Boot 的 Kafka 自動配置來配置 Kafka(請參閱 Spring Boot Kafka 文件)。配置 Spring Boot 的 Kafka 屬性後,您可以透過設定以下屬性來配置 KafkaItemReader 本身
| 財產 | 型別 | 預設值 | 描述 |
|---|---|---|---|
|
|
|
用於在 |
|
|
|
要讀取的主題名稱。 |
|
|
空列表 |
要讀取的分割槽索引列表。 |
|
|
30 |
|
|
|
|
確定是否應儲存狀態以進行重新啟動。 |
請參閱 KafkaItemReader 文件。
原生編譯
單步批處理的優勢在於,當您使用 JVM 時,它允許您在執行時動態選擇要使用的讀取器和寫入器 Bean。但是,當您使用原生編譯時,必須在構建時而不是在執行時確定讀取器和寫入器。以下示例演示瞭如何實現這一點
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>process-aot</id>
<goals>
<goal>process-aot</goal>
</goals>
<configuration>
<jvmArguments>
-Dspring.batch.job.flatfileitemreader.name=fooReader
-Dspring.batch.job.flatfileitemwriter.name=fooWriter
</jvmArguments>
</configuration>
</execution>
</executions>
</plugin>
ItemProcessor 配置
如果 ApplicationContext 中有一個 ItemProcessor 可用,則單步批處理作業自動配置將接受該 ItemProcessor。如果找到正確型別(ItemProcessor<Map<String, Object>, Map<String, Object>>)的處理器,它將被自動注入到步驟中。
ItemWriter 實現的自動配置
此啟動器為與支援的 ItemReader 實現相匹配的 ItemWriter 實現提供自動配置:AmqpItemWriter、FlatFileItemWriter、JdbcItemWriter 和 KafkaItemWriter。本節介紹如何使用自動配置來配置受支援的 ItemWriter。
AmqpItemWriter
要寫入 RabbitMQ 佇列,您需要兩組配置。首先,您需要一個 AmqpTemplate。最簡單的方法是使用 Spring Boot 的 RabbitMQ 自動配置。請參閱 Spring Boot AMQP 文件。
配置 AmqpTemplate 後,您可以透過設定以下屬性來配置 AmqpItemWriter
| 財產 | 型別 | 預設值 | 描述 |
|---|---|---|---|
|
|
|
如果為 |
|
|
|
指示是否應註冊 |
FlatFileItemWriter
要將檔案作為步驟的輸出寫入,您可以配置 FlatFileItemWriter。自動配置接受已明確配置的元件(例如 LineAggregator、FieldExtractor、FlatFileHeaderCallback 或 FlatFileFooterCallback)以及透過設定以下指定屬性配置的元件
| 財產 | 型別 | 預設值 | 描述 |
|---|---|---|---|
|
|
|
要讀取的資源。 |
|
|
|
指示輸出檔案是否為分隔檔案。如果為 |
|
|
|
指示輸出檔案是否為格式化檔案。如果為 |
|
|
|
用於為格式化檔案生成輸出的格式。格式化透過 |
|
|
|
生成檔案時使用的 |
|
|
0 |
記錄的最大長度。如果為 0,則大小無限制。 |
|
|
0 |
最小記錄長度。 |
|
|
|
用於分隔分隔檔案中欄位的 |
|
|
|
寫入檔案時使用的編碼。 |
|
|
|
指示檔案在重新整理時是否應強制同步到磁碟。 |
|
|
|
從記錄中解析出的每個欄位的名稱列表。這些名稱是此 |
|
|
|
指示如果找到輸出檔案,是否應追加到檔案。 |
|
|
|
用於在輸出檔案中分隔行的 |
|
|
|
用於在 |
|
|
|
確定是否應儲存狀態以進行重新啟動。 |
|
|
|
如果設定為 |
|
|
|
如果設定為 |
|
|
|
指示讀取器是否為事務佇列(指示讀取的項在失敗時返回到佇列)。 |
JdbcBatchItemWriter
要將步驟的輸出寫入關係資料庫,此啟動器提供了自動配置 JdbcBatchItemWriter 的能力。自動配置允許您透過設定以下屬性提供您自己的 ItemPreparedStatementSetter 或 ItemSqlParameterSourceProvider 以及配置選項
| 財產 | 型別 | 預設值 | 描述 |
|---|---|---|---|
|
|
|
用於在 |
|
|
|
用於插入每個項的 SQL。 |
|
|
|
是否驗證每次插入是否至少更新一條記錄。 |
您還可以使用以下屬性專門為寫入器指定 JDBC DataSource:。JdbcBatchItemWriter 屬性
| 財產 | 型別 | 預設值 | 描述 |
|---|---|---|---|
|
|
|
確定是否應啟用 |
|
|
|
資料庫的 JDBC URL。 |
|
|
|
資料庫的登入使用者名稱。 |
|
|
|
資料庫的登入密碼。 |
|
|
|
JDBC 驅動程式的完全限定名稱。 |
如果未指定 jdbcbatchitemwriter_datasource,則 JdbcBatchItemWriter 將使用預設的 DataSource。 |
KafkaItemWriter
要將步驟輸出寫入 Kafka 主題,您需要 KafkaItemWriter。此啟動器透過使用兩個來源的功能為 KafkaItemWriter 提供自動配置。首先是 Spring Boot 的 Kafka 自動配置。(請參閱 Spring Boot Kafka 文件。)其次,此啟動器允許您配置寫入器上的兩個屬性。
| 財產 | 型別 | 預設值 | 描述 |
|---|---|---|---|
|
|
|
要寫入的 Kafka 主題。 |
|
|
|
傳遞給寫入器的所有項是否都作為刪除事件傳送到主題。 |
有關 KafkaItemWriter 的配置選項的更多資訊,請參閱 KafkaItemWiter 文件。
Spring AOT
當您將 Spring AOT 與單步批處理啟動器一起使用時,您必須在編譯時設定讀取器和寫入器名稱屬性(除非您為讀取器和/或寫入器建立 Bean)。為此,您必須在 Maven 外掛或 Gradle 外掛的啟動引數或環境變數中包含您希望使用的讀取器和寫入器名稱。例如,如果您希望在 Maven 中啟用 FlatFileItemReader 和 FlatFileItemWriter,它將如下所示
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>process-aot</id>
<goals>
<goal>process-aot</goal>
</goals>
</execution>
</executions>
<configuration>
<arguments>
<argument>--spring.batch.job.flatfileitemreader.name=foobar</argument>
<argument>--spring.batch.job.flatfileitemwriter.name=fooWriter</argument>
</arguments>
</configuration>
</plugin>