Spring批量读取器,写入器和处理器


一个 Item Reader 数据读入来自特定源的弹簧批量应用,而一个 Item Writer 从Spring Batch的应用将数据写入到特定目的地。

一个 Item processor 是包含处理该数据读入到弹簧批次的处理代码的类。如果应用程序读取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 作为值传递给chunk元素 reader 的属性(同样为 writer )。

ItemReader

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

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

Reader 目的
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提供了一个Interface ItemWriter 。所有作者都实现了这个接口。

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

Writer 目的
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类 - 当没有 给出 reader writer ,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;
   }
}