Single Step Batch Job Starter

使用该文档提供的 starter,你可以通过配置来创建具有一个步骤的 Spring Batch Job。此 starter 提供自动配置,用于配置支持的 ItemReader、ItemWriter 或完整的单步 Spring Batch Job。

本节介绍如何使用 Spring Cloud Task 中包含的启动程序开发一个具有单个 Step 的 Spring Batch Job 。此启动程序允许您使用配置来定义 ItemReaderItemWriter 或一个完整的单步 Spring Batch Job 。有关 Spring Batch 及其功能的更多详细信息,请参阅 Spring Batch documentation 。 要获取适用于 Maven 的 starter,请将以下内容添加到构建中:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-single-step-batch-job</artifactId>
    <version>2.3.0</version>
</dependency>

要获取适用于 Gradle 的 starter,请将以下内容添加到构建中:

compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2.3.0"

Defining a Job

你可以使用 starter 来尽可能少地定义 ItemReaderItemWriter,或尽可能多地定义 Job。在本节中,我们定义配置 Job 所需定义的属性。

Properties

首先,starter 提供一组属性,让你可以配置具有一个步骤的基本作业:

Table 1. Job Properties
Property Type Default Value Description

spring.batch.job.jobName

String

null

作业名称。

spring.batch.job.stepName

String

null

步骤名称。

spring.batch.job.chunkSize

Integer

null

每个交易要处理的项目数量。

配置上述属性后,你将获得一个具有一个基于块的步骤的作业。此基于块的步骤将读取、处理和写入 Map<String, Object> 实例作为项目。但是,该步骤尚未执行任何操作。你需要配置一个 ItemReader、一个可选 ItemProcessor 和一个 ItemWriter,以便提供要执行的操作。要配置其中一个,你可以使用属性并配置具有提供的自动配置的选项之一,也可以使用标准 Spring 配置机制配置你自己的选项。

如果你配置自己的属性,输入和输出类型必须与步骤中的其他属性匹配。此 starter 中的 ItemReader 实现和 ItemWriter 实现都将 Map<String, Object> 用作输入和输出项。

Autoconfiguration for ItemReader Implementations

此 starter 为四个不同的 ItemReader 实现(AmqpItemReaderFlatFileItemReaderJdbcCursorItemReaderKafkaItemReader)提供自动配置。在本节中,我们概述了如何使用提供的自动配置配置每一个实现。

AmqpItemReader

您可以使用 AmqpItemReader 来从队列或主题读取。此 ItemReader 实现的自动配置依赖于两组配置。首先是 AmqpTemplate 的配置。您可以自己配置此项,也可以使用 Spring Boot 提供的自动配置。请参阅 Spring Boot AMQP documentation 。配置好 AmqpTemplate 后,您可以通过设置以下属性来启用批处理功能对其提供支持:

Table 2. AmqpItemReader Properties
Property Type Default Value Description

spring.batch.job.amqpitemreader.enabled

boolean

false

如果 true,则自动配置将执行。

spring.batch.job.amqpitemreader.jsonConverterEnabled

boolean

true

指示是否应注册 Jackson2JsonMessageConverter 以解析消息。

有关更多信息,请参阅 AmqpItemReader documentation

FlatFileItemReader

FlatFileItemReader 让你可以从平面文件(例如 CSV 和其他文件格式)中读取。要从文件中读取,你可以通过常规 Spring 配置提供一些组件(LineTokenizerRecordSeparatorPolicyFieldSetMapperLineMapperSkippedLinesCallback)。你还可以使用以下属性配置读取器:

Table 3. FlatFileItemReader Properties
Property Type Default Value Description

spring.batch.job.flatfileitemreader.saveState

boolean

true

确定是否应保存状态以便重启。

spring.batch.job.flatfileitemreader.name

String

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>

empty List

指示文件中注释行(需要忽略的行)的字符串列表。

spring.batch.job.flatfileitemreader.resource

Resource

null

要读取的资源。

spring.batch.job.flatfileitemreader.strict

boolean

true

如果设置为 true,则资源不存在时,阅读器会抛出一个异常。

spring.batch.job.flatfileitemreader.encoding

String

FlatFileItemReader.DEFAULT_CHARSET

读取文件时使用的编码。

spring.batch.job.flatfileitemreader.linesToSkip

int

0

指示文件开头要跳过的行数。

spring.batch.job.flatfileitemreader.delimited

boolean

false

指示文件是否为分隔文件(CSV 和其他格式)。这个属性或 spring.batch.job.flatfileitemreader.fixedLength 中只有一个可以在同一时间 true

spring.batch.job.flatfileitemreader.delimiter

String

DelimitedLineTokenizer.DELIMITER_COMMA

如果读取分隔文件,则指示要解析的分隔符。

spring.batch.job.flatfileitemreader.quoteCharacter

char

DelimitedLineTokenizer.DEFAULT_QUOTE_CHARACTER

用于确定用于对值进行引用的字符。

spring.batch.job.flatfileitemreader.includedFields

List<Integer>

empty list

索引列表以确定要把记录中的哪些字段包括在项目中。

spring.batch.job.flatfileitemreader.fixedLength

boolean

false

指示是否按列数解析文件的记录。这个属性或 spring.batch.job.flatfileitemreader.delimited 中只有一个可以在同一时间 true

spring.batch.job.flatfileitemreader.ranges

List<Range>

empty list

用于解析固定宽度记录的列范围列表。请参阅 Range documentation

spring.batch.job.flatfileitemreader.names

String []

null

从记录中解析的每个字段的名称列表。这些名称是此 ItemReader 中返回的项目中的 Map&lt;String, Object&gt; 中的键。

spring.batch.job.flatfileitemreader.parsingStrict

boolean

true

如果设置为 true,则无法映射字段时,映射将失败。

JdbcCursorItemReader

JdbcCursorItemReader 对关系数据库运行查询,并遍历结果游标 (ResultSet) 提供结果项目。通过此自动配置,你可以提供一个 PreparedStatementSetter、一个 RowMapper 或两者。你还可以使用以下属性配置 JdbcCursorItemReader

Table 4. JdbcCursorItemReader Properties
Property Type Default Value Description

spring.batch.job.jdbccursoritemreader.saveState

boolean

true

确定是否应保存状态以便重启。

spring.batch.job.jdbccursoritemreader.name

String

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

boolean

true

确定在处理时读取器是否应忽略 SQL 警告。

spring.batch.job.jdbccursoritemreader.verifyCursorPosition

boolean

true

指示是否应在每次读取后验证光标的位置,以验证 RowMapper 是否已推进光标。

spring.batch.job.jdbccursoritemreader.driverSupportsAbsolute

boolean

false

指示驱动程序是否支持光标的绝对定位。

spring.batch.job.jdbccursoritemreader.useSharedExtendedConnection

boolean

false

指示连接是否与其他处理共享(因此是事务的一部分)。

spring.batch.job.jdbccursoritemreader.sql

String

null

要从中读取的 SQL 查询。

你还可以通过使用以下属性明确指定读取器的 JDBC 数据源:JdbcCursorItemReader 属性

Property Type Default Value Description

spring.batch.job.jdbccursoritemreader.datasource.enable

boolean

false

确定是否应启用 JdbcCursorItemReader DataSource

jdbccursoritemreader.datasource.url

String

null

数据库的 JDBC URL。

jdbccursoritemreader.datasource.username

String

null

数据库的登录用户名。

jdbccursoritemreader.datasource.password

String

null

数据库的登录密码。

jdbccursoritemreader.datasource.driver-class-name

String

null

JDBC 驱动的完全限定名称。

JDBCCursorItemReader 将使用默认 DataSource,如果未指定 jdbccursoritemreader_datasource

KafkaItemReader

从 Kafka 主题中提取数据分区非常有用,这正是 KafkaItemReader 所能做到的。要配置 KafkaItemReader,需要两部分配置。首先,需要使用 Spring Boot 的 Kafka 自动配置对 Kafka 进行配置(请参见 Spring Boot Kafka documentation)。一旦您通过 Spring Boot 配置了 Kafka 属性,就可以通过设置以下属性来配置 KafkaItemReader 本身:

Table 5. KafkaItemReader Properties
Property Type Default Value Description

spring.batch.job.kafkaitemreader.name

String

null

用于在 ExecutionContext 中提供唯一键的名称。

spring.batch.job.kafkaitemreader.topic

String

null

要从中读取的主题的名称。

spring.batch.job.kafkaitemreader.partitions

List<Integer>

empty list

要从中读取的分区索引列表。

spring.batch.job.kafkaitemreader.pollTimeOutInSeconds

long

30

poll() 操作的超时时间。

spring.batch.job.kafkaitemreader.saveState

boolean

true

确定是否应保存状态以便重启。

Native Compilation

单步批处理的优点在于,它允许你在运行时动态选择要使用的读取和写入 Bean,当你使用 JVM 的时候。然而,当你使用本机编译时,你必须在构建时间而不是运行时确定读取和写入。以下示例演示了这一点:

<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 Configuration

单步批处理作业自动配置接受一个 ItemProcessor(如果一个在 ApplicationContext 中可用)。如果找到正确的类型(ItemProcessor<Map<String, Object>, Map<String, Object>>),它将自动接线到该步骤。

Autoconfiguration for ItemWriter implementations

此启动器为与支持的 ItemReader 实现相匹配的 ItemWriter 实现提供自动配置:AmqpItemWriterFlatFileItemWriterJdbcItemWriterKafkaItemWriter。本节介绍如何使用自动配置配置受支持的 ItemWriter

AmqpItemWriter

要写入 RabbitMQ 队列,您需要两组配置。首先,您需要一个 AmqpTemplate。获取此配置的最简单方法是使用 Spring Boot 的 RabbitMQ 自动配置。请参见 Spring Boot AMQP documentation

一旦你配置了 AmqpTemplate,你就可以通过设置以下属性来配置 AmqpItemWriter

Table 6. AmqpItemWriter Properties
Property Type Default Value Description

spring.batch.job.amqpitemwriter.enabled

boolean

false

如果 true,则运行自动配置。

spring.batch.job.amqpitemwriter.jsonConverterEnabled

boolean

true

表明是否应注册 Jackson2JsonMessageConverter 以转换消息。

FlatFileItemWriter

要将文件作为步骤的输出写入,你可以配置 FlatFileItemWriter。自动配置接受已经显式配置的组件(如 LineAggregatorFieldExtractorFlatFileHeaderCallbackFlatFileFooterCallback)以及通过设置指定以下属性配置的组件:

Table 7. FlatFileItemWriter Properties
Property Type Default Value Description

spring.batch.job.flatfileitemwriter.resource

Resource

null

要读取的资源。

spring.batch.job.flatfileitemwriter.delimited

boolean

false

表明输出文件是否为分隔文件。如果 true,则 spring.batch.job.flatfileitemwriter.formatted 必须是 false

spring.batch.job.flatfileitemwriter.formatted

boolean

false

表明输出文件是否为格式化文件。如果 true,则 spring.batch.job.flatfileitemwriter.delimited 必须是 false

spring.batch.job.flatfileitemwriter.format

String

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

The minimum record length.

spring.batch.job.flatfileitemwriter.delimiter

String

,

在分隔文件中用于分隔字段的 String

spring.batch.job.flatfileitemwriter.encoding

String

FlatFileItemReader.DEFAULT_CHARSET

在写入文件时要使用的编码。

spring.batch.job.flatfileitemwriter.forceSync

boolean

false

表明应在刷新时将文件强制同步到磁盘上。

spring.batch.job.flatfileitemwriter.names

String []

null

从记录中解析的各个字段的名称列表。这些名称是该 ItemWriter 收到的项中 Map&lt;String, Object&gt; 的键。

spring.batch.job.flatfileitemwriter.append

boolean

false

指示在找到输出文件时是否应追加到文件。

spring.batch.job.flatfileitemwriter.lineSeparator

String

FlatFileItemWriter.DEFAULT_LINE_SEPARATOR

要用来分隔输出文件中的行的 String

spring.batch.job.flatfileitemwriter.name

String

null

用于在 ExecutionContext 中提供唯一键的名称。

spring.batch.job.flatfileitemwriter.saveState

boolean

true

确定是否应保存状态以便重启。

spring.batch.job.flatfileitemwriter.shouldDeleteIfEmpty

boolean

false

如果设置为 true,则作业完成后,空文件(没有输出)将被删除。

spring.batch.job.flatfileitemwriter.shouldDeleteIfExists

boolean

true

如果设置为 true,且在输出文件所在的位置找到文件,则在步骤开始前将其删除。

spring.batch.job.flatfileitemwriter.transactional

boolean

FlatFileItemWriter.DEFAULT_TRANSACTIONAL

指示读取器是否是事务队列(表示在失败时,已读项将返回到队列)。

JdbcBatchItemWriter

要将步骤的输出写入关系数据库,此启动器提供了自动配置 JdbcBatchItemWriter 的功能。自动配置允许你提供自己的 ItemPreparedStatementSetterItemSqlParameterSourceProvider 和配置选项,通过设置以下属性:

Table 8. JdbcBatchItemWriter Properties
Property Type Default Value Description

spring.batch.job.jdbcbatchitemwriter.name

String

null

用于在 ExecutionContext 中提供唯一键的名称。

spring.batch.job.jdbcbatchitemwriter.sql

String

null

用于插入每个项的 SQL。

spring.batch.job.jdbcbatchitemwriter.assertUpdates

boolean

true

是否验证每次插入是否都会导致至少一个记录的更新。

你还可以使用以下属性专门为写入器指定 JDBC 数据源:.JdbcBatchItemWriter 属性

Property Type Default Value Description

spring.batch.job.jdbcbatchitemwriter.datasource.enable

boolean

false

确定是否应启用 JdbcCursorItemReader DataSource

jdbcbatchitemwriter.datasource.url

String

null

数据库的 JDBC URL。

jdbcbatchitemwriter.datasource.username

String

null

数据库的登录用户名。

jdbcbatchitemwriter.datasource.password

String

null

数据库的登录密码。

jdbcbatchitemreader.datasource.driver-class-name

String

null

JDBC 驱动的完全限定名称。

JdbcBatchItemWriter 将使用默认 DataSource,如果未指定 jdbcbatchitemwriter_datasource

KafkaItemWriter

要将步骤输出写入 Kafka 主题,您需要 KafkaItemWriter。此启动器通过使用来自两个位置的设施为 KafkaItemWriter 提供自动配置。第一个是 Spring Boot 的 Kafka 自动配置。(请参见 Spring Boot Kafka documentation。)其次,此启动器允许您在编写器上配置两个属性。

Table 9. KafkaItemWriter Properties
Property Type Default Value Description

spring.batch.job.kafkaitemwriter.topic

String

null

要写入的 Kafka 主题。

spring.batch.job.kafkaitemwriter.delete

boolean

false

传递给写手的项是否都作为删除事件发送到主题。

有关 KafkaItemWriter 的配置选项的更多信息,请参见 KafkaItemWiter documentation

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>