Spring Batch - 读取器、写入器和处理器


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

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

块是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、平面文件、CSV 等)读取和写入数据。

要在应用程序中包含读取器,您需要为该读取器定义一个 bean,为该 bean 内的所有必需属性提供值,并将此类 bean 的id作为值传递给块元素读取器的属性(与作家)。

项目阅读器

它是读取数据的(批处理过程)步骤的实体。ItemReader 一次读取一个项目。Spring Batch 提供了一个ItemReader接口。所有读者都实现这个接口。

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

读者 目的
FlatFILEItemReader 从平面文件中读取数据。
StaxEventItemReader 从 XML 文件中读取数据。
存储过程项读取器 从数据库的存储过程中读取数据。
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 一次写入一个项目。Spring Batch 提供了一个ItemWriter接口。所有的作者都实现了这个接口。

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

作家 目的
FlatFILEItemWriter 将数据写入平面文件。
StaxEventItemWriter 将数据写入 XML 文件。
存储过程项编写器 将数据写入数据库的存储过程。
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>

物品处理器

ItemProcessor:ItemProcessor 用于处理数据。当给定项目无效时,它返回null,否则它处理给定项目并返回处理结果。接口ItemProcessor<I,O>表示处理器。

Tasklet 类- 当没有给出读取器写入器时,Tasklet 充当 SpringBatch 的处理器。它只处理单个任务。

我们可以通过实现包org.springframework.batch.item.ItemProcessor的接口ItemProcessor来定义自定义项目处理器。此 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; 
   } 
}