您好,登錄后才能下訂單哦!
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為例,進行配置,如下:
<!-- 內存數據庫h3 -->
<dependency>
<groupId>com.h3database</groupId>
<artifactId>h3</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>
<!-- 內存數據庫h3
<dependency>
<groupId>com.h3database</groupId>
<artifactId>h3</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>
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。