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



项目读取器 (Item Reader) 从特定来源读取数据到 Spring Batch 应用,而项目写入器 (Item Writer) 将数据从 Spring Batch 应用写入特定目标。

项目处理器 (Item Processor) 是一个包含处理代码的类,该代码处理读取到 Spring Batch 中的数据。如果应用读取 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、平面文件、CSV 等。

要在您的应用中包含读取器,您需要为该读取器定义一个 bean,为 bean 中的所有必需属性提供值,并将此 bean 的id作为属性值传递给块元素的reader(写入器writer 同理)。

项目读取器 (ItemReader)

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

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

读取器 用途
FlatFIleItemReader 从平面文件读取数据。
StaxEventItemReader 从 XML 文件读取数据。
StoredProcedureItemReader 从数据库的存储过程中读取数据。
JDBCPagingItemReader 从关系数据库读取数据。
MongoItemReader 从 MongoDB 读取数据。
Neo4jItemReader 从 Neo4j 读取数据。

我们需要通过创建 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)

它是批处理过程步骤中写入数据的元素。ItemWriter 一次写入一个项目。Spring Batch 提供了一个接口ItemWriter。所有写入器都实现此接口。

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

写入器 用途
FlatFIleItemWriter 将数据写入平面文件。
StaxEventItemWriter 将数据写入 XML 文件。
StoredProcedureItemWriter 将数据写入数据库的存储过程。
JDBCPagingItemWriter 将数据写入关系数据库。
MongoItemWriter 将数据写入 MongoDB。
Neo4jItemWriter 将数据写入 Neo4j。

同样,我们需要通过创建 bean 来配置 ItemWriters。以下是一个JdbcCursorItemReader的示例,它将数据写入 MySQL 数据库。

<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 类 - 当没有给出读取器写入器时,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; 
   } 
} 
广告