单步批处理作业Starters

本节介绍如何开发 Spring BatchJob使用单个Step通过使用 starter 包含在 Spring Cloud Task 中。此 Starter 允许您使用配置 要定义ItemReaderItemWriter或完整的单步 Spring BatchJob. 有关 Spring Batch 及其功能的更多信息,请参阅 Spring Batch 文档

要获取 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"

定义作业

您可以使用 starter 定义ItemReaderItemWriter或多达一个完整的Job. 在本节中,我们将定义配置Job.

性能

首先,Starter 提供了一组属性,允许您通过一个 Step 配置 Job 的基础知识:

表 1.作业属性
属性 类型 默认值 描述

spring.batch.job.jobName

String

null

作业的名称。

spring.batch.job.stepName

String

null

步骤的名称。

spring.batch.job.chunkSize

Integer

null

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

配置上述属性后,您将拥有一个具有单个基于块的步骤的作业。 此基于数据块的步骤读取、处理和写入Map<String, Object>实例作为 项目。但是,该步骤尚未执行任何作。您需要配置ItemReader一 自选ItemProcessorItemWriter给它一些事情做。配置一个 其中,您可以使用 properties 并配置已提供的 auto配置,或者您可以使用标准的 Spring 配置来配置自己的 机制。

如果您配置自己的类型,则输入和输出类型必须与步骤中的其他类型匹配。 这ItemReaderimplementations 和ItemWriter此 Starter 中的 implementations 都使用 一个Map<String, Object>作为 Input 和 Output 项。

ItemReader 实现的自动配置

此Starters为四种不同的ItemReader实现:AmqpItemReader,FlatFileItemReader,JdbcCursorItemReaderKafkaItemReader. 在本节中,我们将概述如何使用提供的 autoconfiguration 的

AmqpItemReader

您可以使用 AMQP 从 AMQP 的队列或主题中读取AmqpItemReader.这 autoconfiguration 的ItemReaderimplementation 依赖于两组 配置。第一个是AmqpTemplate.您可以 自己配置或使用 Spring Boot 提供的自动配置。请参阅 Spring Boot AMQP 文档。 配置AmqpTemplate中,您可以启用 Batch 功能来支持它 通过设置以下属性:

表 2.AmqpItemReader性能
属性 类型 默认值 描述

spring.batch.job.amqpitemreader.enabled

boolean

false

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

spring.batch.job.amqpitemreader.jsonConverterEnabled

boolean

true

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

有关更多信息,请参阅AmqpItemReader文档.

FlatFileItemReader

FlatFileItemReader允许您从平面文件(如 CSV 和其他文件格式)。要从文件中读取数据,您可以提供一些组件 您自己通过正常的 Spring 配置 (LineTokenizer,RecordSeparatorPolicy,FieldSetMapper,LineMapperSkippedLinesCallback).您还可以使用 以下属性来配置读取器:

表 3.FlatFileItemReader性能
属性 类型 默认值 描述

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>

空列表

一个 Strings 列表,指示文件中的注释行(要忽略的行)。

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>

空列表

一个索引列表,用于确定要包含在项目中的记录中的哪些字段。

spring.batch.job.flatfileitemreader.fixedLength

boolean

false

指示是否按列号解析文件的记录。只有此属性之一或spring.batch.job.flatfileitemreader.delimited可以是true同时。

spring.batch.job.flatfileitemreader.ranges

List<Range>

空列表

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

spring.batch.job.flatfileitemreader.names

String []

null

从记录中解析的每个字段的名称列表。这些名称是Map<String, Object>在从此返回的项中ItemReader.

spring.batch.job.flatfileitemreader.parsingStrict

boolean

true

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

JdbcCursorItemReader

JdbcCursorItemReader对关系数据库运行查询并迭代 生成的游标 (ResultSet) 以提供生成的项。此 autoconfiguration 允许您提供PreparedStatementSetter一个RowMapper和/或两者。你 还可以使用以下属性来配置JdbcCursorItemReader:

表 4.JdbcCursorItemReader性能
属性 类型 默认值 描述

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

对驱动程序的提示,用于指示每次调用数据库系统要检索的记录数。为了获得最佳性能,您通常需要将其设置为与 chunk 大小匹配。

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 DataSource: .JdbcCursorItemReader性能

属性 类型 默认值 描述

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 驱动程序的完全限定名称。

默认的DataSource将被JDBCCursorItemReader如果jdbccursoritemreader_datasource未指定。

KafkaItemReader

从 Kafka 主题中提取数据分区非常有用,而这正是KafkaItemReader可以做到。要配置KafkaItemReader、两件 的配置是必需的。首先,使用 Spring Boot 的 Kafka 配置 Kafka autoconfiguration 是必需的(请参阅 Spring Boot Kafka 文档)。 从 Spring Boot 配置 Kafka 属性后,您可以配置KafkaItemReader本身:

表 5.KafkaItemReader性能
属性 类型 默认值 描述

spring.batch.job.kafkaitemreader.name

String

null

名称 用于在ExecutionContext.

spring.batch.job.kafkaitemreader.topic

String

null

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

spring.batch.job.kafkaitemreader.partitions

List<Integer>

空列表

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

spring.batch.job.kafkaitemreader.pollTimeOutInSeconds

long

30

超时poll()操作。

spring.batch.job.kafkaitemreader.saveState

boolean

true

确定是否应保存状态以供重新启动。

本机编译

单步批处理的优点是,它允许您在使用 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 配置

单步批处理作业自动配置接受ItemProcessor如果一个 在ApplicationContext.如果找到正确类型的 (ItemProcessor<Map<String, Object>, Map<String, Object>>),则它是自动装配的 进入步骤。

ItemWriter 实现的自动配置

此 starter 为ItemWriter实现 匹配支持的ItemReader实现:AmqpItemWriter,FlatFileItemWriter,JdbcItemWriterKafkaItemWriter.本节 介绍如何使用 autoconfiguration 配置支持的ItemWriter.

AmqpItemWriter 的

要写入 RabbitMQ 队列,您需要两组配置。首先,您需要一个AmqpTemplate.最简单的方法是使用 Spring Boot 的 RabbitMQ 自动配置。请参阅 Spring Boot AMQP 文档

配置AmqpTemplate中,您可以配置AmqpItemWriter通过设置 以下属性:

表 6.AmqpItemWriter性能
属性 类型 默认值 描述

spring.batch.job.amqpitemwriter.enabled

boolean

false

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

spring.batch.job.amqpitemwriter.jsonConverterEnabled

boolean

true

指示Jackson2JsonMessageConverter应注册以转换消息。

FlatFileItemWriter 的

要将文件写入步骤的输出,您可以配置FlatFileItemWriter. 自动配置接受已明确配置的组件(例如LineAggregator,FieldExtractor,FlatFileHeaderCallbackFlatFileFooterCallback) 和 通过设置指定的以下属性来配置的组件:

表 7.FlatFileItemWriter性能
属性 类型 默认值 描述

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

最小记录长度。

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

从记录中解析的每个字段的名称列表。这些名称是Map<String, Object>对于此接收的项目ItemWriter.

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

要将步骤的输出写入关系数据库,此Starters提供了以下功能 要自动配置JdbcBatchItemWriter.自动配置允许您提供 有ItemPreparedStatementSetterItemSqlParameterSourceProvider和 配置选项:

表 8.JdbcBatchItemWriter性能
属性 类型 默认值 描述

spring.batch.job.jdbcbatchitemwriter.name

String

null

名称 用于在ExecutionContext.

spring.batch.job.jdbcbatchitemwriter.sql

String

null

用于插入每个项目的 SQL。

spring.batch.job.jdbcbatchitemwriter.assertUpdates

boolean

true

是否验证每个插入是否导致至少更新一条记录。

您还可以使用以下属性专门为写入器指定 JDBC DataSource: .JdbcBatchItemWriter性能

属性 类型 默认值 描述

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 驱动程序的完全限定名称。

默认的DataSource将被JdbcBatchItemWriter如果jdbcbatchitemwriter_datasource未指定。

KafkaItemWriter

要将步骤输出写入 Kafka 主题,您需要KafkaItemWriter.这个Starters 为KafkaItemWriter通过使用两个地方的设施。 第一个是 Spring Boot 的 Kafka 自动配置。(请参阅 Spring Boot Kafka 文档。 其次,此 starter 允许您在 writer 上配置两个属性。

表 9.KafkaItemWriter性能
属性 类型 默认值 描述

spring.batch.job.kafkaitemwriter.topic

String

null

要写入的 Kafka 主题。

spring.batch.job.kafkaitemwriter.delete

boolean

false

传递给编写器的项目是否全部作为 delete 事件发送到主题。

有关KafkaItemWriter,请参阅KafkaItemWiter文档.

春季 AOT

将 Spring AOT 与 Single Step Batch Starter 一起使用时,您必须将 reader 和 writer name 属性(除非你为 reader 和 or writer 创建一个 bean)。 为此,您必须包含要用作的 reader 和 writer 的名称 以及 boot maven 插件或 gradle 插件中的参数或环境变量。例如,如果 您希望启用FlatFileItemReaderFlatFileItemWriter在 Maven 中,它看起来像:

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