Spring Batch 简明教程

Spring Batch - Readers, Writers & Processors

Item Reader 从特定源读取数据到 Spring Batch 应用程序,而 Item Writer 将数据从 Spring Batch 应用程序写入到特定目标。

Item processor 是一个包含处理代码的类,该代码处理读入到 Spring Batch 中的数据。如果应用程序读取 n 条记录,则处理器中的代码将在每条记录上执行。

chunktasklet 的子元素。它用于执行读取、写入和处理操作。我们可以使用该元素在步骤中配置读取器、写入器和处理器,如下所示。

<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、扁平文件、CSV 等。

要将读取器包含在应用程序中,您需要为该读取器定义一个 bean,为 bean 中的所有必需属性提供值,并将该 bean 的 id 作为 reader 的属性值传递(对 writer 也一样)。

ItemReader

它是读取数据的步骤(批量处理的步骤)的实体。ItemReader 每次读取一项。Spring Batch 提供了一个接口 ItemReader 。所有 readers 都实现了此接口。

以下是 Spring Batch 提供的用于从各种来源读取数据的一些预定义 ItemReader 类。

Reader

Purpose

FlatFIleItemReader

从平面文件中读取数据。

StaxEventItemReader

从 XML 文件中读取数据。

StoredProcedureItemReader

从数据库的存储过程中读取数据。

JDBCPagingItemReader

从关系数据库中读取数据。

MongoItemReader

从 MongoDB 中读取数据。

Neo4jItemReader

从 Neo4jItemReader 中读取数据。

我们需要通过创建 bean 来配置 ItemReaders 。下面是 StaxEventItemReader 的一个示例,它从 XML 文件中读取数据。

<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

Purpose

FlatFIleItemWriter

将数据写入平面文件。

StaxEventItemWriter

将数据写入 XML 文件。

StoredProcedureItemWriter

将数据写入数据库的存储过程。

JDBCPagingItemWriter

将数据写入关系数据库。

MongoItemWriter

将数据写入 MongoDB。

Neo4jItemWriter

将数据写入 Neo4j。

同样,我们需要通过创建 Bean 来配置 ItemWriter。下面是一个将数据写入 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 − 当未给定 readerwriter 时,Tasklet 会充当 SpringBatch 的处理器。它只处理单一任务。

我们可以通过实现包 org.springframework.batch.item.ItemProcessor 的接口 ItemProcessor 来定义一个自定义项处理器。此 ItemProcessor 类接受一个对象并处理数据,然后将处理后的数据作为另一个对象返回。

在批处理中,如果读取 "n" 记录或数据元素,则对于每条记录,它将读取数据、处理数据并将数据写入编写器。要处理数据,它依赖于传递的处理器。

例如,假设你已编写代码来加载特定 PDF 文档、创建新页面、以表格形式将数据项写入 PDF。如果你执行此应用程序,它会从 XML 文档中读取所有数据项,将它们存储在 MySQL 数据库中,并以单个页面形式将它们打印在给定的 PDF 文档中。

Example

以下是示例 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;
   }
}