您好,登錄后才能下訂單哦!
Spring-batch框架學(xué)習(xí)總結(jié)(1)
一.初識(shí)Spring-batch框架:
1.核心名詞解釋:
Job:是Spring-batch框架的核心概念,它包含了批處理的所有操作
Step:每一個(gè)Job由一個(gè)或多個(gè)Step組成,每個(gè)Step中涉及到itemReader,itemProcessor,ItemWriter,這三個(gè)接口顧名思義,一個(gè)負(fù)責(zé)數(shù)據(jù)源,一個(gè)負(fù)責(zé)業(yè)務(wù)邏輯,一個(gè)負(fù)責(zé)處理后的數(shù)據(jù)輸出;
JobRepository:定義Job時(shí),需要指定一個(gè)JobRepository,用來存儲(chǔ)Job在運(yùn)行過程中的狀態(tài)信息,對(duì)于存儲(chǔ)狀態(tài)信息的原因?yàn)椋喝绻鸍ob運(yùn)行失敗了,Spring支持從失敗的地方重新運(yùn)行,而不是從頭開始;
JobLauncher:很好理解launchuer是用來執(zhí)行Job的,如果不設(shè)置,系統(tǒng)也會(huì)默認(rèn)給Job配置默認(rèn)的Launcher;
2.圖解各名詞關(guān)系:
3.Spring-Batch架構(gòu)組件分類:
Application(應(yīng)用層):包含開發(fā)者應(yīng)用Spring-batch編寫的所有批處理作業(yè)和自定義代碼;
Batch Core(核心層):包含加載和控制批處理作業(yè)所必需的核心類,它包含了Job,Step,JobLauncher的實(shí)現(xiàn);
Infrastructure(基礎(chǔ)架構(gòu)層):基礎(chǔ)架構(gòu)層包含了Reader(ItemReader),Writer(ItemWriter),Services可以被應(yīng)用層和核心層使用;
4.各層關(guān)系圖解:
二.創(chuàng)建一個(gè)簡(jiǎn)單的Spring-batch項(xiàng)目
1.創(chuàng)建spring-batch工程,將其導(dǎo)IDE中
2.創(chuàng)建一個(gè)簡(jiǎn)單的Job
(1)創(chuàng)建一個(gè)Configuration包;
(2)創(chuàng)建一個(gè)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啟動(dòng)服務(wù)器異常信息:
解決辦法:分析spring-batch運(yùn)行時(shí)需要數(shù)據(jù)庫支持,而我們沒有連接任何的數(shù)據(jù)庫,故我們以spring中的內(nèi)存數(shù)據(jù)庫H2為例,進(jìn)行配置,如下:
<!-- 內(nèi)存數(shù)據(jù)庫h3 -->
<dependency>
<groupId>com.h3database</groupId>
<artifactId>h3</artifactId>
</dependency>
添加完成,我們繼續(xù)啟動(dòng)項(xiàng)目,查看控制臺(tái):
項(xiàng)目運(yùn)行成功,我們看見控制臺(tái)輸出信息,我們成功創(chuàng)建了Job以及step,并打印出hello word Batch...
三.開發(fā)環(huán)境的搭建
前提:在MySQL數(shù)據(jù)庫中創(chuàng)建我們需要的數(shù)據(jù)庫,我創(chuàng)建的數(shù)據(jù)庫名為springbatch;
1.我們以MySQL數(shù)據(jù)庫為例,首先先加入Jdbc以及mysql數(shù)據(jù)庫的一些依賴(記得注釋掉H2內(nèi)存數(shù)據(jù)庫依賴);
<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
配置完成后,我們?cè)俅螁?dòng)我們的項(xiàng)目,觀察控制臺(tái):
可以看見項(xiàng)目運(yùn)行成功,現(xiàn)在我們?cè)谶M(jìn)入數(shù)據(jù)庫中觀察我們的springbatch數(shù)據(jù)庫結(jié)果我們發(fā)現(xiàn)運(yùn)行之前沒有任何表的數(shù)據(jù)庫現(xiàn)在出現(xiàn)了如下表:
四.總結(jié)SpringBatch中的重要概念(經(jīng)過二,三的學(xué)習(xí)對(duì)一進(jìn)一步認(rèn)識(shí))
1.Job:是一個(gè)接口,接口中定義了一個(gè)作業(yè)是怎么樣執(zhí)行的;JobInstance是為Job的一次運(yùn)行,我們可以將其理解為Job的一個(gè)實(shí)例;JobExceution是JobInstace的每一次執(zhí)行,他會(huì)記錄狀態(tài),根據(jù)狀態(tài)嘗試執(zhí)行,未執(zhí)行成功,下一次繼續(xù)執(zhí)行
2.JobInstance:是job的一次執(zhí)行,一個(gè)JobInstance可重復(fù)執(zhí)行,如果上一次執(zhí)行失敗下次執(zhí)行的時(shí)候還會(huì)重新執(zhí)行上次失敗的job,每一次執(zhí)行就是一個(gè)JobExceution
3.JobParameters:作為參數(shù)可以用來啟動(dòng)Job,并且可以用來標(biāo)識(shí)不同的Job,運(yùn)行時(shí)提供給JobInstance,jonExceution根據(jù)狀態(tài)和參數(shù)決定下一次是否繼續(xù)執(zhí)行
4.JobExceution:每一次嘗試執(zhí)行一個(gè)Job的時(shí)候,我們就可以將其稱為一個(gè)JobExceution,這個(gè)執(zhí)行的結(jié)果可以為成功,也可以為失敗,例如一個(gè)JobInstance執(zhí)行失敗了,下一次執(zhí)行他傳入的參數(shù)是上次執(zhí)行的時(shí)間,他將會(huì)繼續(xù)執(zhí)行,這樣始終執(zhí)行的是一個(gè)JobInstance,而產(chǎn)生了兩個(gè)JobExceution
圖例:
5.Step:主要分為兩塊
(1)Tasklet:接口他其中包含了一個(gè)唯一的方法execute();
(2)Chunk-based:一個(gè)一個(gè)處理Step中如下模塊:
·itemReader:數(shù)據(jù)輸入input:對(duì)于一個(gè)Step而言,每次讀取一個(gè)條目;
·itemProcessor:數(shù)據(jù)處理processing
·ItemWriter:數(shù)據(jù)輸出output:對(duì)于一個(gè)Step而言,每次根據(jù)設(shè)定輸出批量一個(gè)條目;
6.StepExecution:一個(gè)Step的每一次嘗試執(zhí)行,都會(huì)創(chuàng)建一個(gè)StepExection,在一個(gè)Step實(shí)際開始執(zhí)行的時(shí)候創(chuàng)建(如下圖解)
7.ExecutionContext:執(zhí)行上下文,代表的是一個(gè)key-value鍵值對(duì)的集合,可以被Spring框架進(jìn)行在持久化管理,能夠是開發(fā)人員存儲(chǔ)持久化狀態(tài),每一個(gè)JobExecution以及每一個(gè)StepExecution的執(zhí)行都會(huì)對(duì)應(yīng)一個(gè)執(zhí)行上下文(ExecutionContext);對(duì)于StepExecution在每一次提交點(diǎn)時(shí)就會(huì)保存一下執(zhí)行上下文,而對(duì)于Job是在每一個(gè)StepExecution執(zhí)行之間進(jìn)行保存,例如,我們從Step1換到Step2是就會(huì)保存;
8.JobRepository:此條不再重復(fù)解釋
9.JobLauncher:接口,用于啟動(dòng)和加載Job,根據(jù)傳入的參數(shù)進(jìn)行啟動(dòng),返回Job一次執(zhí)行的情況,如下接口方法;
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>
<!-- 內(nèi)存數(shù)據(jù)庫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>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。