Spring Batch Hello World Exemple

Exemple de Spring Batch Hello World

Spring Batch est un cadre pour le traitement par lots - exécution d'une série de travaux. Dans Spring Batch, un travail se compose de plusieurs étapes et chaque étape se compose d'une tâcheREAD-PROCESS-WRITE ou d'une tâche `+ opération unique +` (tasklet).

  1. Pour le processus «READ-PROCESS-WRITE», cela signifie «lire» les données des ressources (csv, xml ou base de données), les «traiter» et les «écrire» dans d'autres ressources (csv, xml et base de données). Par exemple, une étape peut lire les données d'un fichier CSV, les traiter et les écrire dans la base de données. Spring Batch fournit de nombreuses classes conçues pour lire / écrire CSV, XML et base de données.

  2. Pour une tâche d'opération «unique» (tasklet), cela signifie faire une seule tâche, comme nettoyer les ressources après ou avant le début ou la fin d'une étape.

  3. Et les étapes peuvent être enchaînées pour fonctionner comme un travail.

1 Job = Many Steps.
1 Step = 1 READ-PROCESS-WRITE or 1 Tasklet.
Job = {Step 1 -> Step 2 -> Step 3} (Chained together)

Exemples de lots de printemps

Envisagez les travaux par lots suivants:

  1. Étape 1 - Lisez les fichiers CSV du dossier A, traitez-les, écrivez-les dans le dossier B. "LIRE-PROCESS-ÉCRIRE"

  2. Étape 2 - Lisez les fichiers CSV du dossier B, traitez-les, écrivez-les dans la base de données. "LIRE-PROCESS-ÉCRIRE"

  3. Étape 3 - Supprimer les fichiers CSB du dossier B. «Tasklet»

  4. Étape 4 - Lisez les données d'une base de données, traitez et générez un rapport statistique au format XML, écrivez-le dans le dossier C. "LIRE-PROCESS-ÉCRIRE"

  5. Étape 5 - Lisez le rapport et envoyez-le à l'adresse e-mail du responsable. «Tasklet»

Dans Spring Batch, nous pouvons déclarer comme suit:

  
    
      
        
      
    
    
      
        
      
    
    
      
    
    
      
        
      
    
    
        
    
  

L'ensemble des travaux et l'exécution des étapes sont stockés dans la base de données, ce qui permet à l'étape ayant échoué de redémarrer à l'endroit où elle a échoué, pas besoin de recommencer tout le travail.

1. Didacticiel

Dans ce tutoriel Spring Batch, nous allons vous montrer comment créer un travail, lire un fichier CSV, le traiter, écrire la sortie dans un fichier XML.

Outils et bibliothèques utilisés

  1. Maven 3

  2. Eclipse 4.2

  3. JDK 1.6

  4. Spring Core 3.2.2.RELEASE

  5. Spring OXM 3.2.2.RELEASE

  6. Spring JDBC 3.2.2.RELEASE

  7. Spring Batch 2.2.0.RELEASE

2. Répertoire des projets

Consultez le répertoire final du projet, un projet Maven standard.

spring-batch-hello-world-directory

3. Dépendances du projet

Ils doivent avoir des dépendances telles que Spring Core, Spring Batch et JDK 1.5. Lisez les commentaires pour s'expliquer d'eux-mêmes.

pom.xml


    4.0.0
    com.example
    SpringBatchExample
    jar
    1.0-SNAPSHOT
    SpringBatchExample
    http://maven.apache.org

    
        1.6
        3.2.2.RELEASE
        2.2.0.RELEASE
        5.1.25
        4.11
    

    

        
        
            org.springframework
            spring-core
            ${spring.version}
        

        
        
            org.springframework
            spring-jdbc
            ${spring.version}
        

        
        
            org.springframework
            spring-oxm
            ${spring.version}
        

        
        
            mysql
            mysql-connector-java
            ${mysql.driver.version}
        

        
        
            org.springframework.batch
            spring-batch-core
            ${spring.batch.version}
        
        
            org.springframework.batch
            spring-batch-infrastructure
            ${spring.batch.version}
        

        
        
            org.springframework.batch
            spring-batch-test
            ${spring.batch.version}
        

        
        
            junit
            junit
            ${junit.version}
            test
        

    
    
        spring-batch
        
            
                org.apache.maven.plugins
                maven-eclipse-plugin
                2.9
                
                    true
                    false
                
            
            
                org.apache.maven.plugins
                maven-compiler-plugin
                2.3.2
                
                    ${jdk.version}
                    ${jdk.version}
                
            
        
    

4. Emplois Spring Batch

Un fichier CSV.

report.csv

1001,"213,100",980,"example", 29/7/2013
1002,"320,200",1080,"staff 1", 30/7/2013
1003,"342,197",1200,"staff 2", 31/7/2013

Un travail Spring batch, pour lire le fichier csv ci-dessus avecFlatFileItemReader, traiter les données avecitemProcessor et les écrire dans un fichier XML
avecStaxEventItemWriter.

job-hello-world.xml



    
    

    
    

    
      
        
            
            
        
      
    

    

        

        
            
            
                
                    
                
            
            
                

                 
            
            
        

    

    
        
        
        
    

    
       
        
            com.example.model.Report
        
        
    

Mappez la valeur CSV à l'objetReport et écrivez-la dans un fichier XML (via des annotations jaxb).

Report.java

package com.example.model;

import java.math.BigDecimal;
import java.util.Date;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "record")
public class Report {

    private int id;
    private BigDecimal sales;
    private int qty;
    private String staffName;
    private Date date;

    @XmlAttribute(name = "id")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @XmlElement(name = "sales")
    public BigDecimal getSales() {
        return sales;
    }

    public void setSales(BigDecimal sales) {
        this.sales = sales;
    }

    @XmlElement(name = "qty")
    public int getQty() {
        return qty;
    }

    public void setQty(int qty) {
        this.qty = qty;
    }

    @XmlElement(name = "staffName")
    public String getStaffName() {
        return staffName;
    }

    public void setStaffName(String staffName) {
        this.staffName = staffName;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "Report [id=" + id + ", sales=" + sales
                    + ", qty=" + qty + ", staffName=" + staffName + "]";
    }

}

Pour convertir unDate, vous avez besoin d'unFieldSetMapper personnalisé. S'il n'y a pas de conversion de type de données, utilisez simplementBeanWrapperFieldSetMapper pour mapper automatiquement les valeurs par nom.

ReportFieldSetMapper.java

package com.example;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.validation.BindException;

import com.example.model.Report;

public class ReportFieldSetMapper implements FieldSetMapper {

    private SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

    @Override
    public Report mapFieldSet(FieldSet fieldSet) throws BindException {

        Report report = new Report();
        report.setId(fieldSet.readInt(0));
        report.setSales(fieldSet.readBigDecimal(1));
        report.setQty(fieldSet.readInt(2));
        report.setStaffName(fieldSet.readString(3));

        //default format yyyy-MM-dd
        //fieldSet.readDate(4);
        String date = fieldSet.readString(4);
        try {
            report.setDate(dateFormat.parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return report;

    }

}

Un itemProcessor sera déclenché avant itemWriter.

CustomItemProcessor.java

package com.example;

import org.springframework.batch.item.ItemProcessor;
import com.example.model.Report;

public class CustomItemProcessor implements ItemProcessor {

    @Override
    public Report process(Report item) throws Exception {

        System.out.println("Processing..." + item);
        return item;
    }

}

Contexte Spring et configuration de la base de données.

context.xml



    
    

     
    
        
        
        
    

    

    
        
    

database.xml



        
    
        
        
        
        
    

    

    
    
        
        
    

5. Exécuter

La façon la plus simple d'exécuter un travail par lots.

package com.example;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
  public static void main(String[] args) {

    String[] springConfig  =
        {
            "spring/batch/jobs/job-hello-world.xml"
        };

    ApplicationContext context =
            new ClassPathXmlApplicationContext(springConfig);

    JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
    Job job = (Job) context.getBean("helloWorldJob");

    try {

        JobExecution execution = jobLauncher.run(job, new JobParameters());
        System.out.println("Exit Status : " + execution.getStatus());

    } catch (Exception e) {
        e.printStackTrace();
    }

    System.out.println("Done");

  }
}

Sortie

report.xml



    
        2013-07-29T00:00:00+08:00
        980
        213100
        example
    
    
        2013-07-30T00:00:00+08:00
        1080
        320200
        staff 1
    
    
        2013-07-31T00:00:00+08:00
        1200
        342197
        staff 2
    

Dans la console

Jul 30, 2013 11:52:00 PM org.springframework.batch.core.launch.support.SimpleJobLauncher$1 run
INFO: Job: [FlowJob: [name=helloWorldJob]] launched with the following parameters: [{}]
Jul 30, 2013 11:52:00 PM org.springframework.batch.core.job.SimpleStepHandler handleStep
INFO: Executing step: [step1]
Processing...Report [id=1001, sales=213100, qty=980, staffName=example]
Processing...Report [id=1002, sales=320200, qty=1080, staffName=staff 1]
Processing...Report [id=1003, sales=342197, qty=1200, staffName=staff 2]
Jul 30, 2013 11:52:00 PM org.springframework.batch.core.launch.support.SimpleJobLauncher$1 run
INFO: Job: [FlowJob: [name=helloWorldJob]] completed with the following parameters: [{}] and the following status: [COMPLETED]
Exit Status : COMPLETED
Done

Télécharger le code source

Téléchargez-le -SpringBatch-Hello-World-Example.zip (27 ko)