Spring Batch - leitores, escritores e processadores

A Item Reader lê dados no aplicativo de lote de primavera de uma fonte específica, enquanto Item Writer grava dados do aplicativo Spring Batch em um destino específico.

A Item processoré uma classe que contém o código de processamento que processa os dados lidos no lote de primavera. Se o aplicativo ler n registros, o código no processador será executado em cada registro.

UMA chunk é um elemento filho de tasklet. É usado para executar operações de leitura, gravação e processamento. Podemos configurar leitor, gravador e processadores usando este elemento, em uma etapa conforme mostrado abaixo.

<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 fornece leitores e gravadores para ler e escrever dados de vários sistemas de arquivos / bancos de dados, como MongoDB, Neo4j, MySQL, XML, flatfile, CSV, etc.

Para incluir um leitor em seu aplicativo, você precisa definir um bean para esse leitor, fornecer valores para todas as propriedades necessárias dentro do bean e passar o id de tal bean como um valor para o atributo do elemento chunk reader (o mesmo para writer)

ItemReader

É a entidade de uma etapa (de um processo em lote) que lê os dados. Um ItemReader lê um item por vez. Spring Batch fornece uma interfaceItemReader. Todosreaders implementar esta interface.

A seguir estão algumas das classes ItemReader predefinidas fornecidas pelo Spring Batch para leitura de várias fontes.

Leitor Objetivo
FlatFIleItemReader Para ler dados de arquivos simples.
StaxEventItemReader Para ler dados de arquivos XML.
StoredProcedureItemReader Para ler dados dos procedimentos armazenados de um banco de dados.
JDBCPagingItemReader Para ler dados de bancos de dados relacionais.
MongoItemReader Para ler dados do MongoDB.
Neo4jItemReader Para ler dados do Neo4jItemReader.

Precisamos configurar o ItemReaderscriando os grãos. A seguir está um exemplo deStaxEventItemReader que lê dados de um arquivo 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>

Conforme observado, durante a configuração, precisamos especificar o respectivo nome da classe do leitor necessário e precisamos fornecer valores para todas as propriedades necessárias.

ItemWriter

É o elemento do stepde um processo em lote que grava dados. Um ItemWriter grava um item por vez. Spring Batch fornece uma interfaceItemWriter. Todos os escritores implementam essa interface.

A seguir estão algumas das classes ItemWriter predefinidas fornecidas pelo Spring Batch para leitura de várias fontes.

Escritor Objetivo
FlatFIleItemWriter Para gravar dados em arquivos simples.
StaxEventItemWriter Para gravar dados em arquivos XML.
StoredProcedureItemWriter Para gravar dados nos procedimentos armazenados de um banco de dados.
JDBCPagingItemWriter Para gravar dados em bancos de dados relacionais.
MongoItemWriter Para gravar dados no MongoDB.
Neo4jItemWriter Para gravar dados no Neo4j.

Da mesma forma, precisamos configurar os ItemWriters criando os beans. A seguir está um exemplo deJdbcCursorItemReader que grava dados em um banco de dados 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>

Processador de Item

ItemProcessor: Um ItemProcessor é usado para processar os dados. Quando o item fornecido não é válido, ele retornanull, caso contrário, ele processa o item fornecido e retorna o resultado processado. A interfaceItemProcessor<I,O> representa o processador.

Tasklet class - quando não reader e writersão fornecidos, um Tasklet atua como um processador para SpringBatch. Ele processa apenas uma tarefa.

Podemos definir um processador de item personalizado implementando a interface ItemProcessor do pacote org.springframework.batch.item.ItemProcessor. Esta classe ItemProcessor aceita um objeto e processa os dados e retorna os dados processados ​​como outro objeto.

Em um processo em lote, se "n"registros ou elementos de dados são lidos e, para cada registro, ele lerá os dados, processará e gravará os dados no gravador. Para processar os dados, ele retransmite no processador que passou.

Por exemplo, suponha que você tenha escrito um código para carregar um documento PDF específico, criar uma nova página, gravar o item de dados no PDF em um formato tabular. Se você executar este aplicativo, ele lê todos os itens de dados do documento XML, armazena-os no banco de dados MySQL e os imprime no documento PDF fornecido em páginas individuais.

Exemplo

A seguir está um exemplo de classe 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; 
   } 
}