Пример Spring Batch Hello World

Весенняя партия Hello World Пример

Spring Batch - это фреймворк для пакетной обработки - выполнения ряда заданий. В Spring Batch задание состоит из множества шагов, и каждый шаг состоит из задачиREAD-PROCESS-WRITE или задачи `+ single operation +` (tasklet).

  1. Для процесса «READ-PROCESS-WRITE» это означает «читать» данные из ресурсов (csv, xml или database), «обрабатывать» их и «записывать» в другие ресурсы (csv, xml и database). Например, шаг может считывать данные из файла CSV, обрабатывать их и записывать в базу данных. Spring Batch предоставляет множество созданных классов для чтения / записи CSV, XML и базы данных.

  2. Для «одной» задачи операции (тасклета) это означает выполнение только одной задачи, например очистка ресурсов после или до начала или завершения шага.

  3. И шаги могут быть объединены в цепочку, чтобы работать как работа.

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

Примеры весенних партий

Рассмотрим следующие пакетные задания:

  1. Шаг 1 - Чтение файлов CSV из папки A, обработка, запись в папку B. «READ-PROCESS-WRITE»

  2. Шаг 2 - Чтение CSV-файлов из папки B, обработка, запись в базу данных. «READ-PROCESS-WRITE»

  3. Шаг 3 - Удалите файлы CSB из папки B. «Тасклет»

  4. Шаг 4 - Считайте данные из базы данных, обработайте и сгенерируйте статистический отчет в формате XML, запишите его в папку C. «READ-PROCESS-WRITE»

  5. Шаг 5 - Прочитайте отчет и отправьте его менеджеру по электронной почте. «Тасклет»

В Spring Batch мы можем объявить так:

  
    
      
        
      
    
    
      
        
      
    
    
      
    
    
      
        
      
    
    
        
    
  

Все задания и шаги выполнения хранятся в базе данных, что позволяет перезапустить сбойный шаг в том месте, где он был сбой, и нет необходимости начинать все задание.

1. Руководство

В этом уроке Spring Batch мы покажем вам, как создать задание, прочитать файл CSV, обработать его, записать вывод в файл XML.

Использованные инструменты и библиотеки

  1. Maven 3

  2. Затмение 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. Каталог проектов

Просмотрите итоговый каталог проектов, стандартный проект Maven.

spring-batch-hello-world-directory

3. Зависимости проекта

У них должны быть зависимости только Spring Core, Spring Batch и JDK 1.5. Читайте комментарии для самоочевидных.

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. Весенние партии рабочих мест

Файл 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

Пакетное задание Spring для чтения указанного выше CSV-файла с помощьюFlatFileItemReader, обработка данных с помощьюitemProcessor и запись их в XML-файл
с помощьюStaxEventItemWriter.

job-hello-world.xml



    
    

    
    

    
      
        
            
            
        
      
    

    

        

        
            
            
                
                    
                
            
            
                

                 
            
            
        

    

    
        
        
        
    

    
       
        
            com.example.model.Report
        
        
    

Сопоставьте значение CSV с объектомReport и запишите его в файл XML (с помощью аннотаций 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 + "]";
    }

}

Чтобы преобразоватьDate, вам нужен собственныйFieldSetMapper. Если нет преобразования типа данных, просто используйтеBeanWrapperFieldSetMapper для автоматического сопоставления значений по имени.

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;

    }

}

ItemProcessor будет запущен до 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;
    }

}

Весенний контекст и конфигурация базы данных.

context.xml



    
    

     
    
        
        
        
    

    

    
        
    

database.xml



        
    
        
        
        
        
    

    

    
    
        
        
    

5. Запустить его

Самый простой способ запустить пакетное задание.

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");

  }
}

Выход

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
    

В консоли

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

Скачать исходный код

Скачать -SpringBatch-Hello-World-Example.zip (27 кб)