Spring Batch - Readers, Writers & Processors
Item Reader 将数据从特定源读入 Spring Batch 应用程序,而 Item Writer 将数据从 Spring Batch 应用程序写入特定目标。
Item processor 是一个类,它包含处理读入 spring 批处理的数据的处理代码。 如果应用程序读取 n 条记录,处理器中的代码将在每条记录上执行。
chunk 是 tasklet 的子元素。 它用于执行读取、写入和处理操作。 我们可以在如下所示的步骤中使用此元素配置读取器、写入器和处理器。
实例
<batch:job id = "helloWorldJob">
<batch:step id = "step1">
<batch:tasklet>
<batch:chunk reader = "cvsFileItemReader" writer = "xmlItemWriter"
processor = "itemProcessor" commit-interval = "10">
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
Spring Batch 提供读取器和写入器从各种文件系统/数据库中读取和写入数据,例如 MongoDB、Neo4j、MySQL、XML、flatfile、CSV 等。
要在应用程序中包含阅读器,您需要为该阅读器定义一个 bean,为 bean 中的所有必需属性提供值,并将此类 bean 的 id 作为值传递给块元素 reader 的属性 (对于 writer 也是如此)。
ItemReader
它是读取数据的步骤(批处理)的实体。 ItemReader 一次读取一个项目。 Spring Batch 提供了一个接口 ItemReader。 所有的readers都实现了这个接口。
以下是 Spring Batch 提供的一些预定义 ItemReader 类,用于从各种源中读取。
Reader | 目的 |
---|---|
FlatFIleItemReader | 从平面文件中读取数据。 |
StaxEventItemReader | 从 XML 文件中读取数据。 |
StoredProcedureItemReader | 从数据库的存储过程中读取数据。 |
JDBCPagingItemReader | 从关系数据库数据库中读取数据。 |
MongoItemReader | 从 MongoDB 读取数据。 |
Neo4jItemReader | 从 Neo4j ItemReader 读取数据。 |
我们需要通过创建 bean 来配置 ItemReaders。 以下是从 XML 文件读取数据的 StaxEventItemReader 示例。
实例
<bean id = "mysqlItemWriter"
class = "org.springframework.batch.item.xml.StaxEventItemWriter">
<property name = "resource" value = "file:xml/outputs/userss.xml" />
<property name = "marshaller" ref = "reportMarshaller" />
<property name = "rootTagName" value = "Tutorial" />
</bean>
<bean id = "reportMarshaller"
class = "org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name = "classesToBeBound">
<list>
<value>Tutorial</value>
</list>
</property>
</bean>
正如所观察到的,在配置时,我们需要指定所需阅读器的相应类名,并且我们需要为所有所需属性提供值。
ItemWriter
它是写入数据的批处理的 step 元素。 ItemWriter 一次写入一个项目。 Spring Batch 提供了一个接口 ItemWriter。 所有的作者都实现了这个接口。
以下是 Spring Batch 提供的一些预定义 ItemWriter 类,用于从各种源中读取。
Writer | 目的 |
---|---|
FlatFIleItemWriter | 将数据写入平面文件。 |
StaxEventItemWriter | 将数据写入 XML 文件。 |
StoredProcedureItemWriter | 将数据写入数据库的存储过程。 |
JDBCPagingItemWriter | 将数据写入关系数据库。 |
MongoItemWriter | 将数据写入 MongoDB。 |
Neo4jItemWriter | 将数据写入 Neo4j。 |
同样,我们需要通过创建 bean 来配置 ItemWriters。 以下是一个将数据写入 MySQL 数据库的 JdbcCursorItemReader 示例。
实例
<bean id = "dbItemReader"
class = "org.springframework.batch.item.database.JdbcCursorItemReader" scope = "step">
<property name = "dataSource" ref = "dataSource" />
<property name = "sql" value = "select * from tutorialsdata" />
<property name = "rowMapper">
<bean class = "TutorialRowMapper" />
</property>
</bean>
Item Processor
ItemProcessor:ItemProcessor 用于处理数据。 当给定项无效时,它返回 null,否则处理给定项并返回处理后的结果。接口 ItemProcessor<I,O> 表示处理器。
Tasklet class − 当没有给出 reader 和 writer 时,Tasklet 充当 SpringBatch 的处理器。 它只处理单个任务。
我们可以通过实现包org.springframework.batch.item.ItemProcessor的接口ItemProcessor来定义一个自定义的item处理器。 这个 ItemProcessor 类接受一个对象并处理数据并将处理后的数据作为另一个对象返回。
在一个批处理过程中,如果读取"n"条记录或数据元素,那么对于每条记录,它将读取数据,处理它,并将数据写入写入器。 为了处理数据,它在传递的处理器上进行中继。
例如,假设您编写了代码来加载特定的 PDF 文档、创建新页面、以表格格式将数据项写入 PDF。如果执行此应用程序,它会从 XML 文档中读取所有数据项,将它们存储在 MySQL 数据库中,然后将它们打印到给定 PDF 文档中的各个页面中。
示例
以下是一个示例 ItemProcessor 类。
实例
import org.springframework.batch.item.ItemProcessor;
public class CustomItemProcessor implements ItemProcessor<Tutorial, Tutorial> {
@Override
public Tutorial process(Tutorial item) throws Exception {
System.out.println("Processing..." + item);
return item;
}
}