单步批处理作业启动器
本节将介绍如何使用 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>