Spring Batch - Readers, Writers & Processors

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

Item processor 是一个类,它包含处理读入 spring 批处理的数据的处理代码。 如果应用程序读取 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、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 − 当没有给出 readerwriter 时,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; 
   } 
}