1. 程式人生 > >Spring Batch 之 背景框架簡介

Spring Batch 之 背景框架簡介

   

        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 的 一個HelloSpringBatch Demo :

pom 檔案,引入配置:

<dependencies>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-batch</artifactId>
   </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-starter-web</artifactId>
   </dependency>
   <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.16.20</version>
      <scope>compile</scope>
   </dependency>
   <!--<dependency>-->
      <!--<groupId>com.h2database</groupId>-->
      <!--<artifactId>h2</artifactId>-->
   <!--</dependency>-->

       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
       </dependency>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
   </dependency>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
   </dependency>
   <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.5</version>
   </dependency>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-oxm</artifactId>
       </dependency>
   <dependency>
      <groupId>com.thoughtworks.xstream</groupId>
      <artifactId>xstream</artifactId>
      <version>1.4.10</version>
   </dependency>

   </dependencies>

spring batch JobConfig:

    配置一個job,和所屬的step;此處demo,使用虛擬碼寫入,輸出,再後續部落格中,將更新,基於資料庫,檔案等輸入、輸出。

package com.batch.demo.helloSpringBatch;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class JobConfiguration {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job helloWorldJob(){
        return jobBuilderFactory.get("helloWorldJob")
                .start(step1())
                .build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
                        System.out.println("Hello Spring Batch");
                        return RepeatStatus.FINISHED;
                    }
                }).build();
    }
}

 

application.properties:

#配置spring batch job instance 等資訊存放資料來源
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test
spring.datasource.username=root
spring.datasource.password=123

#初始化spring batch job、step等資訊存放的表,demo使用mysql
#spring.datasource.schema=classpath:/org/springframework/batch/core/schema-mysql.sql
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect

#spring.batch.initialize-schema=always

#是否啟動專案時候,自動執行job
#spring.batch.job.enabled = false

執行後,控制檯輸出:

2018-12-30 15:47:45.696  INFO 8896 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=helloWorldJob]] launched with the following parameters: [{}]
2018-12-30 15:47:45.753  INFO 8896 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [step1]
Hello Spring Batch
2018-12-30 15:47:45.950  INFO 8896 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=helloWorldJob]] completed with the following parameters: [{}] and the following status: [COMPLETED]

在資料庫中,可以檢視到job的具體資訊:

     

       到這裡,一個簡單的 hello world job 就已經執行完畢了。

       本文主要是介紹下spring bacth的背景和架構組織,後續部落格將逐步針對JobLauncher 、Job、Step、ItemReader、ItemProcessor 、ItemWriter 基於檔案、資料庫等儲存進行批處理。                         

 

    補充:

     spring batch 的資訊配置表建立,是根據datesource去讀取,匹配執行相對應的sql進行create table。具體執行指令碼在spring-batch-core下:classpath:/org/springframework/batch/core/schema-***.sql。