Springboot集成Spring Batch


Spring官網 (https://spring.io/projects/spring-batch#overview )對Spring  Batch的解釋:


    

     一個輕量級的、全面的批處理框架,用於開發對企業系統的日常操作至關重要的健壯批處理應用程序。

                 Spring Batch提供了處理大量記錄所必需的可重用功能,包括日志/跟蹤、事務管理、作業處理統計信息、 

         作業重啟、跳過和資源管理。它還提供了更高級的技術服務和特性,這些特性將通過優化和分區技術支持極高

         容量和高性能的批處理作業。無論簡單還是復雜,大容量批處理作業都可以以高度可伸縮的方式利用框架來處

         理大量信息。

                Features(特性):

  • Transaction management   事務管理
  • Chunk based processing    基於塊的處理
  • Declarative I/O聲明式I / O
  • Start/Stop/Restart                 啟動/停止/啟動
  • Retry/Skip                              重試/跳過
  • Web based administration interface (Spring Cloud Data Flow)       基於Web的管理接口(Spring Cloud Data Flow)          

 


 

 

    Spring batch主要有以下部分組成:

  • JobRepository       用來注冊job的容器
  • JobLauncher              用來啟動Job的接口
  • Job                               實際執行的任務,包含一個或多個Step
  • Step                             step包含ItemReader、ItemProcessor和ItemWriter
  • ItemReader                 用來讀取數據的接口
  • ItemProcessor            用來處理數據的接口
  • ItemWriter                   用來輸出數據的接口

 

              一個Job有一個或多個Step組成,Step有讀、處理、寫三部分操作組成;通過JobLauncher啟動Job,啟動時從

       JobRepository獲取Job Execution;

              當前運行的Job及Step的結果及狀態保存在JobRepository中。

              下面是Springboot集成Spring Batch 的 一個Demo:

 

1.在idea下新建一個springboot項目

    pom.xml

    

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>springbatch</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springbatch</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

 

  ItemReader

public class Reader implements ItemReader<String> {

    private String[] messages = { "籃球之神 Michael Jordan",
                                     "歡迎來到batch示例 Welcome to Spring Batch Example",
                                     "The more time goes by,The more life happens" };

    private int count = 0;

    @Override
    public  String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException{
        if(count<messages.length){
            return messages[count++];
        }else{
            count=0;
        }
        return null;
    }

ItemProcessor

public class Processor implements ItemProcessor<String,String> {
    @Override
    public String process(String data) throws Exception{
        return  data.toUpperCase();
    }
}

ItemWriter

public class Writer implements ItemWriter<String> {

    @Override
    public void write(List<? extends String> messages) throws Exception{
        for(String msg:messages){
            System.out.println("輸出信息:"+ msg);
        }

    }
}

Listener

public class JobCompletionListener extends JobExecutionListenerSupport {

    @Override
    public void beforeJob(JobExecution jobExecution){
        if(jobExecution.getStatus()== BatchStatus.STARTED){
            System.out.println("批處理執行開始....");
        }
    }
    @Override
    public void afterJob(JobExecution jobExecution){
        if(jobExecution.getStatus()== BatchStatus.COMPLETED){
            System.out.println("批處理執行結束....");
        }


    }
}

Config

@Configuration
public class BatchConfig {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job processJob(){
        return jobBuilderFactory.get("processJob")
                .incrementer(new RunIdIncrementer()).listener(listener())
                .flow(orderStep1()).end().build();
    }

    @Bean
    public Step orderStep1() {
        return stepBuilderFactory.get("orderStep1").<String, String> chunk(1)
                .reader(new Reader()).processor(new Processor())
                .writer(new Writer()).build();
    }

    @Bean
    public JobExecutionListener listener() {
        return new JobCompletionListener();
    }
}

Controller

@RestController
@EnableScheduling
public class JobInvokerController {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job processJob;

    //每20秒執行一次
    @Scheduled(cron = "*/20 * *  * * * ")
    public void handle() throws Exception {

        JobParameters jobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis())
                .toJobParameters();
        jobLauncher.run(processJob, jobParameters);

    }
}

啟動項目:每20秒執行一次批處理

 

 

代碼地址:https://github.com/liuchunbo24/Springboot-SpringBatch-Demo

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM