1. 程式人生 > >Spring-Batch學習總結(1)——重要概念,環境搭建,名詞解釋,第一個項目及異常處理

Spring-Batch學習總結(1)——重要概念,環境搭建,名詞解釋,第一個項目及異常處理

img truct 設定 uil sna sta col key services

Spring-batch框架學習總結(1)
一.初識Spring-batch框架:
1.核心名詞解釋:
Job:是Spring-batch框架的核心概念,它包含了批處理的所有操作
Step:每一個Job由一個或多個Step組成,每個Step中涉及到itemReader,itemProcessor,ItemWriter,這三個接口顧名思義,一個負責數據源,一個負責業務邏輯,一個負責處理後的數據輸出;
JobRepository:定義Job時,需要指定一個JobRepository,用來存儲Job在運行過程中的狀態信息,對於存儲狀態信息的原因為:如果Job運行失敗了,Spring支持從失敗的地方重新運行,而不是從頭開始;
JobLauncher:很好理解launchuer是用來執行Job的,如果不設置,系統也會默認給Job配置默認的Launcher;
2.圖解各名詞關系:
技術分享圖片
3.Spring-Batch架構組件分類:
Application(應用層):包含開發者應用Spring-batch編寫的所有批處理作業和自定義代碼;
Batch Core(核心層):包含加載和控制批處理作業所必需的核心類,它包含了Job,Step,JobLauncher的實現;
Infrastructure(基礎架構層):基礎架構層包含了Reader(ItemReader),Writer(ItemWriter),Services可以被應用層和核心層使用;

4.各層關系圖解:

技術分享圖片
二.創建一個簡單的Spring-batch項目
1.創建spring-batch工程,將其導IDE中
技術分享圖片

2.創建一個簡單的Job
(1)創建一個Configuration包;

(2)創建一個Configuration類:需加上@Configuration;@EnableBatchProcessing;

(3)註入使用的依賴@Autowired:JobBuilderFactory;StepbuilderFactory;

(4)類展示:

package com.dhcc.batch.batchDemo.config;

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.launch.JobLauncher;
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;
import org.springframework.context.annotation.Primary;

@Configuration 
@EnableBatchProcessing
public class JobConfiguration {
    @Autowired
    private JobBuilderFactory jobBuilderFactory;
    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Primary
    @Bean
    public Job helloWord() {
        return jobBuilderFactory.get("helloWordJob").start(step1()).build();

    }

    JobLauncher
    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1").tasklet(new Tasklet() {

            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                System.out.println("Hello Spring Batch....");
                return RepeatStatus.FINISHED;
            }
        }).build();

    }
}

(5)打開BatchDemoApplication啟動服務器異常信息:
技術分享圖片
解決辦法:分析spring-batch運行時需要數據庫支持,而我們沒有連接任何的數據庫,故我們以spring中的內存數據庫H2為例,進行配置,如下:

<!-- 內存數據庫h2 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>

添加完成,我們繼續啟動項目,查看控制臺:
技術分享圖片
項目運行成功,我們看見控制臺輸出信息,我們成功創建了Job以及step,並打印出hello word Batch...
三.開發環境的搭建
前提:在MySQL數據庫中創建我們需要的數據庫,我創建的數據庫名為springbatch;
技術分享圖片
1.我們以MySQL數據庫為例,首先先加入Jdbc以及mysql數據庫的一些依賴(記得註釋掉H2內存數據庫依賴);

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

2.在application.properties下添加配置信息;

spring.datasource.url=jdbc:mysql://localhost:3306/springbatch?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=root
spring.datasource.password=qitao1996
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.schema=classpath:/org/springframework/batch/core/schema-mysql.sql

spring.batch.initialize-schema=always

配置完成後,我們再次啟動我們的項目,觀察控制臺:
技術分享圖片

可以看見項目運行成功,現在我們在進入數據庫中觀察我們的springbatch數據庫結果我們發現運行之前沒有任何表的數據庫現在出現了如下表:
技術分享圖片
四.總結SpringBatch中的重要概念(經過二,三的學習對一進一步認識)
1.Job:是一個接口,接口中定義了一個作業是怎麽樣執行的;JobInstance是為Job的一次運行,我們可以將其理解為Job的一個實例;JobExceution是JobInstace的每一次執行,他會記錄狀態,根據狀態嘗試執行,未執行成功,下一次繼續執行
2.JobInstance:是job的一次執行,一個JobInstance可重復執行,如果上一次執行失敗下次執行的時候還會重新執行上次失敗的job,每一次執行就是一個JobExceution
3.JobParameters:作為參數可以用來啟動Job,並且可以用來標識不同的Job,運行時提供給JobInstance,jonExceution根據狀態和參數決定下一次是否繼續執行
4.JobExceution:每一次嘗試執行一個Job的時候,我們就可以將其稱為一個JobExceution,這個執行的結果可以為成功,也可以為失敗,例如一個JobInstance執行失敗了,下一次執行他傳入的參數是上次執行的時間,他將會繼續執行,這樣始終執行的是一個JobInstance,而產生了兩個JobExceution
圖例:
技術分享圖片
5.Step:主要分為兩塊
(1)Tasklet:接口他其中包含了一個唯一的方法execute();
(2)Chunk-based:一個一個處理Step中如下模塊:
·itemReader:數據輸入input:對於一個Step而言,每次讀取一個條目;
·itemProcessor:數據處理processing
·ItemWriter:數據輸出output:對於一個Step而言,每次根據設定輸出批量一個條目;
6.StepExecution:一個Step的每一次嘗試執行,都會創建一個StepExection,在一個Step實際開始執行的時候創建(如下圖解)
技術分享圖片
7.ExecutionContext:執行上下文,代表的是一個key-value鍵值對的集合,可以被Spring框架進行在持久化管理,能夠是開發人員存儲持久化狀態,每一個JobExecution以及每一個StepExecution的執行都會對應一個執行上下文(ExecutionContext);對於StepExecution在每一次提交點時就會保存一下執行上下文,而對於Job是在每一個StepExecution執行之間進行保存,例如,我們從Step1換到Step2是就會保存;
8.JobRepository:此條不再重復解釋
9.JobLauncher:接口,用於啟動和加載Job,根據傳入的參數進行啟動,返回Job一次執行的情況,如下接口方法;

public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException,
            JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException;

下面附完整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.dhcc.batch</groupId>
    <artifactId>batchDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

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

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.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-batch</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.batch</groupId>
            <artifactId>spring-batch-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 內存數據庫h2 
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        -->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

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

</project>

Spring-Batch學習總結(1)——重要概念,環境搭建,名詞解釋,第一個項目及異常處理