Spring Batch - Lecteurs, écrivains et processeurs

Un Item Reader lit les données dans l'application Spring batch à partir d'une source particulière, alors qu'un Item Writer écrit les données de l'application Spring Batch vers une destination particulière.

Un Item processorest une classe qui contient le code de traitement qui traite les données lues dans le lot de ressorts. Si l'application lit n enregistrements, le code dans le processeur sera exécuté sur chaque enregistrement.

UNE chunk est un élément enfant de tasklet. Il est utilisé pour effectuer des opérations de lecture, d'écriture et de traitement. Nous pouvons configurer le lecteur, l'écrivain et les processeurs à l'aide de cet élément, dans une étape comme indiqué ci-dessous.

<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 fournit des lecteurs et des rédacteurs pour lire et écrire des données de divers systèmes de fichiers / bases de données tels que MongoDB, Neo4j, MySQL, XML, flatfile, CSV, etc.

Pour inclure un lecteur dans votre application, vous devez définir un bean pour ce lecteur, fournir des valeurs à toutes les propriétés requises dans le bean et passer le id d'un tel bean comme valeur de l'attribut de l'élément chunk reader (pareil pour writer).

ItemReader

C'est l'entité d'une étape (d'un traitement par lots) qui lit les données. Un ItemReader lit un élément à la fois. Spring Batch fournit une interfaceItemReader. Tous lesreaders implémentez cette interface.

Voici quelques-unes des classes ItemReader prédéfinies fournies par Spring Batch pour lire à partir de diverses sources.

Lecteur Objectif
FlatFIleItemReader Pour lire des données à partir de fichiers plats.
StaxEventItemReader Pour lire des données à partir de fichiers XML.
StoredProcedureItemReader Pour lire des données à partir des procédures stockées d'une base de données.
JDBCPagingItemReader Pour lire les données de la base de données de bases de données relationnelles.
MongoItemReader Pour lire les données de MongoDB.
Neo4jItemReader Pour lire les données de Neo4jItemReader.

Nous devons configurer le ItemReadersen créant les haricots. Voici un exemple deStaxEventItemReader qui lit les données d'un fichier 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>

Comme observé, lors de la configuration, nous devons spécifier le nom de classe respectif du lecteur requis et nous devons fournir des valeurs à toutes les propriétés requises.

ItemWriter

C'est l'élément de la stepd'un traitement par lots qui écrit des données. Un ItemWriter écrit un élément à la fois. Spring Batch fournit une interfaceItemWriter. Tous les rédacteurs implémentent cette interface.

Voici quelques-unes des classes ItemWriter prédéfinies fournies par Spring Batch pour lire à partir de diverses sources.

Écrivain Objectif
FlatFIleItemWriter Pour écrire des données dans des fichiers plats.
StaxEventItemWriter Pour écrire des données dans des fichiers XML.
StoredProcedureItemWriter Pour écrire des données dans les procédures stockées d'une base de données.
JDBCPagingItemWriter Pour écrire des données dans la base de données de bases de données relationnelles.
MongoItemWriter Pour écrire des données dans MongoDB.
Neo4jItemWriter Pour écrire des données dans Neo4j.

De la même manière, nous devons configurer les ItemWriters en créant les beans. Voici un exemple deJdbcCursorItemReader qui écrit des données dans une base de données 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>

Processeur d'articles

ItemProcessor: Un ItemProcessor est utilisé pour traiter les données. Lorsque l'élément donné n'est pas valide, il retournenull, sinon il traite l'élément donné et renvoie le résultat traité. L'interfaceItemProcessor<I,O> représente le processeur.

Tasklet class - Quand non reader et writersont donnés, un Tasklet agit comme un processeur pour SpringBatch. Il ne traite qu'une seule tâche.

Nous pouvons définir un processeur d'élément personnalisé en implémentant l'interface ItemProcessor du forfait org.springframework.batch.item.ItemProcessor. Cette classe ItemProcessor accepte un objet et traite les données et renvoie les données traitées comme un autre objet.

Dans un processus par lots, si "n"les enregistrements ou éléments de données sont lus, puis pour chaque enregistrement, il lira les données, les traitera et les écrit dans l'enregistreur. Pour traiter les données, il relais sur le processeur passé.

Par exemple, supposons que vous ayez écrit du code pour charger un document PDF particulier, créer une nouvelle page, écrire la donnée élémentaire sur le PDF dans un format tabulaire. Si vous exécutez cette application, elle lit tous les éléments de données du document XML, les stocke dans la base de données MySQL et les imprime dans le document PDF donné sur des pages individuelles.

Exemple

Voici un exemple 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; 
   } 
}