單步批處理作業啟動器

本節將介紹如何使用 Spring Cloud Task 中包含的啟動器,開發一個包含單個 Step 的 Spring Batch Job。此啟動器允許您透過配置定義 ItemReaderItemWriter 或完整的單步 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"

定義作業

您可以使用啟動器來定義最少的 ItemReaderItemWriter,或者定義完整的 Job。在本節中,我們將定義配置 Job 所需的屬性。

屬性

首先,啟動器提供了一組屬性,讓您可以配置包含一個 Step 的 Job 的基本資訊

表 1. Job 屬性
財產 型別 預設值 描述

spring.batch.job.jobName

字串

null

作業名稱。

spring.batch.job.stepName

字串

null

步驟名稱。

spring.batch.job.chunkSize

整數

null

每個事務處理的項數。

配置上述屬性後,您將擁有一個包含單個基於塊的步驟的作業。此基於塊的步驟讀取、處理並寫入 Map<String, Object> 例項作為項。但是,該步驟尚未執行任何操作。您需要配置一個 ItemReader、一個可選的 ItemProcessor 和一個 ItemWriter 以使其執行某些操作。要配置其中之一,您可以使用屬性並配置已提供自動配置的選項之一,或者您可以使用標準的 Spring 配置機制配置您自己的。

如果您配置自己的,則輸入和輸出型別必須與步驟中的其他型別匹配。此啟動器中的 ItemReader 實現和 ItemWriter 實現都使用 Map<String, Object> 作為輸入和輸出項。

ItemReader 實現的自動配置

此啟動器為四種不同的 ItemReader 實現提供了自動配置:AmqpItemReaderFlatFileItemReaderJdbcCursorItemReaderKafkaItemReader。在本節中,我們將概述如何使用提供的自動配置來配置這些實現。

AmqpItemReader

您可以使用 AmqpItemReader 從 AMQP 佇列或主題讀取資料。此 ItemReader 實現的自動配置取決於兩組配置。首先是 AmqpTemplate 的配置。您可以自己配置此項,也可以使用 Spring Boot 提供的自動配置。請參閱 Spring Boot AMQP 文件。配置 AmqpTemplate 後,您可以透過設定以下屬性來啟用批處理功能以支援它

表 2. AmqpItemReader 屬性
財產 型別 預設值 描述

spring.batch.job.amqpitemreader.enabled

布林值

如果為 true,則執行自動配置。

spring.batch.job.amqpitemreader.jsonConverterEnabled

布林值

true

指示是否應註冊 Jackson2JsonMessageConverter 以解析訊息。

有關更多資訊,請參閱 AmqpItemReader 文件

FlatFileItemReader

FlatFileItemReader 允許您從平面檔案(例如 CSV 和其他檔案格式)讀取資料。要從檔案讀取資料,您可以透過正常的 Spring 配置(LineTokenizerRecordSeparatorPolicyFieldSetMapperLineMapperSkippedLinesCallback)自行提供一些元件。您還可以使用以下屬性配置讀取器

表 3. FlatFileItemReader 屬性
財產 型別 預設值 描述

spring.batch.job.flatfileitemreader.saveState

布林值

true

確定是否應儲存狀態以進行重新啟動。

spring.batch.job.flatfileitemreader.name

字串

null

用於在 ExecutionContext 中提供唯一鍵的名稱。

spring.batch.job.flatfileitemreader.maxItemcount

int

Integer.MAX_VALUE

要從檔案中讀取的最大項數。

spring.batch.job.flatfileitemreader.currentItemCount

int

0

已讀取的項數。在重新啟動時使用。

spring.batch.job.flatfileitemreader.comments

List<String>

空列表

指示檔案中註釋行(要忽略的行)的字串列表。

spring.batch.job.flatfileitemreader.resource

資源

null

要讀取的資源。

spring.batch.job.flatfileitemreader.strict

布林值

true

如果設定為 true,則如果找不到資源,讀取器將丟擲異常。

spring.batch.job.flatfileitemreader.encoding

字串

FlatFileItemReader.DEFAULT_CHARSET

讀取檔案時使用的編碼。

spring.batch.job.flatfileitemreader.linesToSkip

int

0

指示在檔案開頭要跳過的行數。

spring.batch.job.flatfileitemreader.delimited

布林值

指示檔案是否為分隔檔案(CSV 和其他格式)。此屬性或 spring.batch.job.flatfileitemreader.fixedLength 只能同時為 true

spring.batch.job.flatfileitemreader.delimiter

字串

DelimitedLineTokenizer.DELIMITER_COMMA

如果讀取分隔檔案,則指示要解析的分隔符。

spring.batch.job.flatfileitemreader.quoteCharacter

char

DelimitedLineTokenizer.DEFAULT_QUOTE_CHARACTER

用於確定用於引用值的字元。

spring.batch.job.flatfileitemreader.includedFields

List<Integer>

空列表

用於確定記錄中要包含在項中的欄位的索引列表。

spring.batch.job.flatfileitemreader.fixedLength

布林值

指示檔案的記錄是否按列號解析。此屬性或 spring.batch.job.flatfileitemreader.delimited 只能同時為 true

spring.batch.job.flatfileitemreader.ranges

List<Range>

空列表

用於解析固定寬度記錄的列範圍列表。請參閱 Range 文件

spring.batch.job.flatfileitemreader.names

String []

null

從記錄中解析出的每個欄位的名稱列表。這些名稱是此 ItemReader 返回的項中 Map<String, Object> 的鍵。

spring.batch.job.flatfileitemreader.parsingStrict

布林值

true

如果設定為 true,則如果欄位無法對映,則對映失敗。

JdbcCursorItemReader

JdbcCursorItemReader 對關係資料庫執行查詢,並迭代結果遊標(ResultSet)以提供結果項。此自動配置允許您提供 PreparedStatementSetterRowMapper 或兩者。您還可以使用以下屬性配置 JdbcCursorItemReader

表 4. JdbcCursorItemReader 屬性
財產 型別 預設值 描述

spring.batch.job.jdbccursoritemreader.saveState

布林值

true

確定是否應儲存狀態以進行重新啟動。

spring.batch.job.jdbccursoritemreader.name

字串

null

用於在 ExecutionContext 中提供唯一鍵的名稱。

spring.batch.job.jdbccursoritemreader.maxItemcount

int

Integer.MAX_VALUE

要從檔案中讀取的最大項數。

spring.batch.job.jdbccursoritemreader.currentItemCount

int

0

已讀取的項數。在重新啟動時使用。

spring.batch.job.jdbccursoritemreader.fetchSize

int

向驅動程式提供的提示,指示每次呼叫資料庫系統時要檢索的記錄數。為了獲得最佳效能,您通常希望將其設定為與塊大小匹配。

spring.batch.job.jdbccursoritemreader.maxRows

int

要從資料庫讀取的最大項數。

spring.batch.job.jdbccursoritemreader.queryTimeout

int

查詢超時前的毫秒數。

spring.batch.job.jdbccursoritemreader.ignoreWarnings

布林值

true

確定讀取器在處理時是否應忽略 SQL 警告。

spring.batch.job.jdbccursoritemreader.verifyCursorPosition

布林值

true

指示是否應在每次讀取後驗證遊標位置,以驗證 RowMapper 是否未移動遊標。

spring.batch.job.jdbccursoritemreader.driverSupportsAbsolute

布林值

指示驅動程式是否支援遊標的絕對定位。

spring.batch.job.jdbccursoritemreader.useSharedExtendedConnection

布林值

指示連線是否與其他處理共享(因此是事務的一部分)。

spring.batch.job.jdbccursoritemreader.sql

字串

null

要讀取的 SQL 查詢。

您還可以使用以下屬性專門為讀取器指定 JDBC DataSource:。JdbcCursorItemReader 屬性

財產 型別 預設值 描述

spring.batch.job.jdbccursoritemreader.datasource.enable

布林值

確定是否應啟用 JdbcCursorItemReader DataSource

jdbccursoritemreader.datasource.url

字串

null

資料庫的 JDBC URL。

jdbccursoritemreader.datasource.username

字串

null

資料庫的登入使用者名稱。

jdbccursoritemreader.datasource.password

字串

null

資料庫的登入密碼。

jdbccursoritemreader.datasource.driver-class-name

字串

null

JDBC 驅動程式的完全限定名稱。

如果未指定 jdbccursoritemreader_datasource,則 JDBCCursorItemReader 將使用預設的 DataSource

KafkaItemReader

從 Kafka 主題攝取分割槽資料非常有用,這正是 KafkaItemReader 可以做到的。要配置 KafkaItemReader,需要兩部分配置。首先,需要使用 Spring Boot 的 Kafka 自動配置來配置 Kafka(請參閱 Spring Boot Kafka 文件)。配置 Spring Boot 的 Kafka 屬性後,您可以透過設定以下屬性來配置 KafkaItemReader 本身

表 5. KafkaItemReader 屬性
財產 型別 預設值 描述

spring.batch.job.kafkaitemreader.name

字串

null

用於在 ExecutionContext 中提供唯一鍵的名稱。

spring.batch.job.kafkaitemreader.topic

字串

null

要讀取的主題名稱。

spring.batch.job.kafkaitemreader.partitions

List<Integer>

空列表

要讀取的分割槽索引列表。

spring.batch.job.kafkaitemreader.pollTimeOutInSeconds

long

30

poll() 操作的超時時間。

spring.batch.job.kafkaitemreader.saveState

布林值

true

確定是否應儲存狀態以進行重新啟動。

請參閱 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 實現提供自動配置:AmqpItemWriterFlatFileItemWriterJdbcItemWriterKafkaItemWriter。本節介紹如何使用自動配置來配置受支援的 ItemWriter

AmqpItemWriter

要寫入 RabbitMQ 佇列,您需要兩組配置。首先,您需要一個 AmqpTemplate。最簡單的方法是使用 Spring Boot 的 RabbitMQ 自動配置。請參閱 Spring Boot AMQP 文件

配置 AmqpTemplate 後,您可以透過設定以下屬性來配置 AmqpItemWriter

表 6. AmqpItemWriter 屬性
財產 型別 預設值 描述

spring.batch.job.amqpitemwriter.enabled

布林值

如果為 true,則自動配置執行。

spring.batch.job.amqpitemwriter.jsonConverterEnabled

布林值

true

指示是否應註冊 Jackson2JsonMessageConverter 以轉換訊息。

FlatFileItemWriter

要將檔案作為步驟的輸出寫入,您可以配置 FlatFileItemWriter。自動配置接受已明確配置的元件(例如 LineAggregatorFieldExtractorFlatFileHeaderCallbackFlatFileFooterCallback)以及透過設定以下指定屬性配置的元件

表 7. FlatFileItemWriter 屬性
財產 型別 預設值 描述

spring.batch.job.flatfileitemwriter.resource

資源

null

要讀取的資源。

spring.batch.job.flatfileitemwriter.delimited

布林值

指示輸出檔案是否為分隔檔案。如果為 true,則 spring.batch.job.flatfileitemwriter.formatted 必須為 false

spring.batch.job.flatfileitemwriter.formatted

布林值

指示輸出檔案是否為格式化檔案。如果為 true,則 spring.batch.job.flatfileitemwriter.delimited 必須為 false

spring.batch.job.flatfileitemwriter.format

字串

null

用於為格式化檔案生成輸出的格式。格式化透過 String.format 執行。

spring.batch.job.flatfileitemwriter.locale

Locale

Locale.getDefault()

生成檔案時使用的 Locale

spring.batch.job.flatfileitemwriter.maximumLength

int

0

記錄的最大長度。如果為 0,則大小無限制。

spring.batch.job.flatfileitemwriter.minimumLength

int

0

最小記錄長度。

spring.batch.job.flatfileitemwriter.delimiter

字串

,

用於分隔分隔檔案中欄位的 String

spring.batch.job.flatfileitemwriter.encoding

字串

FlatFileItemReader.DEFAULT_CHARSET

寫入檔案時使用的編碼。

spring.batch.job.flatfileitemwriter.forceSync

布林值

指示檔案在重新整理時是否應強制同步到磁碟。

spring.batch.job.flatfileitemwriter.names

String []

null

從記錄中解析出的每個欄位的名稱列表。這些名稱是此 ItemWriter 接收的項中 Map<String, Object> 的鍵。

spring.batch.job.flatfileitemwriter.append

布林值

指示如果找到輸出檔案,是否應追加到檔案。

spring.batch.job.flatfileitemwriter.lineSeparator

字串

FlatFileItemWriter.DEFAULT_LINE_SEPARATOR

用於在輸出檔案中分隔行的 String

spring.batch.job.flatfileitemwriter.name

字串

null

用於在 ExecutionContext 中提供唯一鍵的名稱。

spring.batch.job.flatfileitemwriter.saveState

布林值

true

確定是否應儲存狀態以進行重新啟動。

spring.batch.job.flatfileitemwriter.shouldDeleteIfEmpty

布林值

如果設定為 true,則在作業完成時刪除空檔案(無輸出)。

spring.batch.job.flatfileitemwriter.shouldDeleteIfExists

布林值

true

如果設定為 true,並且在輸出檔案應存在的位置找到檔案,則在步驟開始前刪除該檔案。

spring.batch.job.flatfileitemwriter.transactional

布林值

FlatFileItemWriter.DEFAULT_TRANSACTIONAL

指示讀取器是否為事務佇列(指示讀取的項在失敗時返回到佇列)。

JdbcBatchItemWriter

要將步驟的輸出寫入關係資料庫,此啟動器提供了自動配置 JdbcBatchItemWriter 的能力。自動配置允許您透過設定以下屬性提供您自己的 ItemPreparedStatementSetterItemSqlParameterSourceProvider 以及配置選項

表 8. JdbcBatchItemWriter 屬性
財產 型別 預設值 描述

spring.batch.job.jdbcbatchitemwriter.name

字串

null

用於在 ExecutionContext 中提供唯一鍵的名稱。

spring.batch.job.jdbcbatchitemwriter.sql

字串

null

用於插入每個項的 SQL。

spring.batch.job.jdbcbatchitemwriter.assertUpdates

布林值

true

是否驗證每次插入是否至少更新一條記錄。

您還可以使用以下屬性專門為寫入器指定 JDBC DataSource:。JdbcBatchItemWriter 屬性

財產 型別 預設值 描述

spring.batch.job.jdbcbatchitemwriter.datasource.enable

布林值

確定是否應啟用 JdbcCursorItemReader DataSource

jdbcbatchitemwriter.datasource.url

字串

null

資料庫的 JDBC URL。

jdbcbatchitemwriter.datasource.username

字串

null

資料庫的登入使用者名稱。

jdbcbatchitemwriter.datasource.password

字串

null

資料庫的登入密碼。

jdbcbatchitemreader.datasource.driver-class-name

字串

null

JDBC 驅動程式的完全限定名稱。

如果未指定 jdbcbatchitemwriter_datasource,則 JdbcBatchItemWriter 將使用預設的 DataSource

KafkaItemWriter

要將步驟輸出寫入 Kafka 主題,您需要 KafkaItemWriter。此啟動器透過使用兩個來源的功能為 KafkaItemWriter 提供自動配置。首先是 Spring Boot 的 Kafka 自動配置。(請參閱 Spring Boot Kafka 文件。)其次,此啟動器允許您配置寫入器上的兩個屬性。

表 9. KafkaItemWriter 屬性
財產 型別 預設值 描述

spring.batch.job.kafkaitemwriter.topic

字串

null

要寫入的 Kafka 主題。

spring.batch.job.kafkaitemwriter.delete

布林值

傳遞給寫入器的所有項是否都作為刪除事件傳送到主題。

有關 KafkaItemWriter 的配置選項的更多資訊,請參閱 KafkaItemWiter 文件

Spring AOT

當您將 Spring AOT 與單步批處理啟動器一起使用時,您必須在編譯時設定讀取器和寫入器名稱屬性(除非您為讀取器和/或寫入器建立 Bean)。為此,您必須在 Maven 外掛或 Gradle 外掛的啟動引數或環境變數中包含您希望使用的讀取器和寫入器名稱。例如,如果您希望在 Maven 中啟用 FlatFileItemReaderFlatFileItemWriter,它將如下所示

    <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>
© . This site is unofficial and not affiliated with VMware.