【Spring】SpringBatch快速入門


SpringBatch概述

  文檔:https://docs.spring.io/spring-batch/docs/current/reference/html/index.html

​   Spring Batch是個輕量級的、 完善的批處理框架,旨在幫助企業建立健壯、高效的批處理應用。Spring Batch是Spring的一個子項目,使用Java語言並基於Spring框架為基礎開發,使得已經使用Spring框架的開發者或者企業更容易訪問和利用企業服務。

  Spring Batch提供了大量可重用的組件,包括了日志追蹤、事務、任務作業統計、任務重啟、跳過、重復資源管理。對於大數據量和高性能的批處理任 務,Spring Batch同樣提供了高級功能和特性來支持比如分區功能、遠程功能。總之,通過Spring Batch能夠支持簡單的、復雜的和大數據量的批處理作業。

  Spring Batch是一個批處理應用框架,不是調度框架,但需要和調度框架合作來構建完成的批處理任務。它只關注批處理任務相關的問題,如事務、並發、監控、執行等,並不提供相應的調度功能。如果需要使用調用框架,在商業軟件和開源軟件中已經有很多優秀的企業級調度框架(如Quartz. Tivoli、 Control-M、 Cron等)可以使用。

  框架主要有以下功能: Transaction management (事務管理) Chunk based processing (基於塊的處理) Declarative 1/0 (聲明式的輸入輸出) Start/Stop/Restart (啟動/停止/再啟動) Retry/Skip (重試/跳過)

   

   框架一共有4個主要角色:

  JobLauncher是任務啟動器,通過它來啟動任務,可以看做是程序的入口。

  Job代表着一個具體的任務。

  Step代表着一個具體的步驟,一個Job可以包含多個Step (想象把大象放進冰箱這個任務需要多少個步驟你就明白了) .

  JobRepository是存儲數據的地方,可以看做是一個數據庫的接口,在任務執行的時候需要通過它來記錄任務狀態等等信息。

SpringBatch入門程序

  1、創建一個SpringBoot項目,SpringBatch依賴,如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>com.test</groupId>
 8     <artifactId>test-springboot-batch</artifactId>
 9     <version>1.0-SNAPSHOT</version>
10 
11     <parent>
12         <groupId>org.springframework.boot</groupId>
13         <artifactId>spring-boot-starter-parent</artifactId>
14         <version>2.2.5.RELEASE</version>
15         <relativePath/> <!-- lookup parent from repository -->
16     </parent>
17 
18     <properties>
19         <maven.compiler.source>8</maven.compiler.source>
20         <maven.compiler.target>8</maven.compiler.target>
21     </properties>
22 
23     <dependencies>
24         <dependency>
25             <groupId>org.springframework.boot</groupId>
26             <artifactId>spring-boot-starter-web</artifactId>
27         </dependency>
28 
29         <dependency>
30             <groupId>org.springframework.boot</groupId>
31             <artifactId>spring-boot-starter-batch</artifactId>
32         </dependency>
33 
34         <!-- mysql -->
35         <dependency>
36             <groupId>mysql</groupId>
37             <artifactId>mysql-connector-java</artifactId>
38             <version>8.0.12</version>
39         </dependency>
40     </dependencies>
41 
42     <build>
43         <plugins>
44             <plugin>
45                 <groupId>org.springframework.boot</groupId>
46                 <artifactId>spring-boot-maven-plugin</artifactId>
47             </plugin>
48         </plugins>
49     </build>
50 
51 </project>
View Code  

   2、編輯配置文件,這里要使用mysql數據庫,任務信息持久化到數據庫中

1 spring:
2   datasource:
3     username: root
4     password: 123456
5     url: jdbc:mysql://127.0.0.1:3306/test_springbatch?allowPublicKeyRetrieval=true&useSSL=true
6     driver-class-name: com.mysql.cj.jdbc.Driver
7     # 初始化數據庫,文件在依賴jar包中
8     schema: classpath:org/springframework/batch/core/schema-mysql.sql
9     initialization-mode: always 

   3、編輯主啟動類

1 @SpringBootApplication
2 public class Application {
3 
4     public static void main(String[] args) {
5 
6         SpringApplication.run(Application.class);
7     }
8 }

  4、配置Job

 1 package com.test.config;
 2 
 3 import org.springframework.batch.core.Job;
 4 import org.springframework.batch.core.Step;
 5 import org.springframework.batch.core.StepContribution;
 6 import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
 7 import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
 8 import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
 9 import org.springframework.batch.core.scope.context.ChunkContext;
10 import org.springframework.batch.core.step.tasklet.Tasklet;
11 import org.springframework.batch.repeat.RepeatStatus;
12 import org.springframework.beans.factory.annotation.Autowired;
13 import org.springframework.context.annotation.Bean;
14 import org.springframework.context.annotation.Configuration;
15 
16 /**
17  * @author H__D
18  * @description 
19  * @date 2021/10/30
20  */
21 @Configuration
22 // 啟用批處理功能
23 @EnableBatchProcessing
24 public class JobConfiguration {
25 
26     // 注入創建任務的對象
27     @Autowired
28     private JobBuilderFactory jobBuilderFactory;
29 
30     // 注入創建步驟的對象
31     @Autowired
32     private StepBuilderFactory stepBuilderFactory;
33 
34     @Bean
35     public Job helloworldJob() {
36         return jobBuilderFactory.get("helloworldJob")
37                 .start(step1())
38                 .build();
39     }
40 
41     @Bean
42     public Step step1() {
43         return stepBuilderFactory.get("step1")
44                 .tasklet(new Tasklet() {
45                     @Override
46                     public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
47                         System.out.println(Thread.currentThread().getName() + "------" + "hello world");
48                         // 返回執行完成狀態
49                         return RepeatStatus.FINISHED;
50                     }
51                 }).build();
52     }
53 }

  5、運行啟動類

  查看結果

   mysql數據庫

核心API

  參考:https://docs.spring.io/spring-batch/docs/current/reference/html/domain.html#domainLanguageOfBatch

  Job

  描述與批處理作業概念相關的構造型。AJob是封裝了整個批處理過程的實體。與其他 Spring 項目一樣,aJob與 XML 配置文件或基於 Java 的配置連接在一起。這種配置可以被稱為“作業配置”。但是, Job它只是整個層次結構的頂部,如下圖所示: 

  

  JobInstance

  JobInstance指的是邏輯作業運行的概念。考慮應該在一天結束時運行一次的批處理作業,例如Job上圖中的“EndOfDay” 有一個“EndOfDay”作業,但Job必須單獨跟蹤每個單獨的運行在這項工作的情況下,JobInstance每天有一個合乎邏輯的

  JobParameters

  一個JobParameters對象包含一組用於啟動批處理作業的參數。它們可用於識別甚至在運行期間作為參考數據,如下圖所示:

  

  JobExecution

   JobExecution指的是單次嘗試運行作業的技術概念。執行可能以失敗或成功結束,但JobInstance除非執行成功完成,否則對應於給定執行的不被視為完成。

   Job定義了作業是什么以及如何執行它,並且 a JobInstance是一個純粹的組織對象,用於將執行組合在一起,主要是為了啟用正確的重啟語義。

  Step 

  A Step是一個域對象,它封裝了批處理作業的一個獨立的、連續的階段。因此,每個 Job 完全由一個或多個步驟組成。AStep包含定義和控制實際批處理所需的所有信息。這是一個必然模糊的描述,因為任何給定的內容Step都由開發人員自行決定編寫JobAStep可以像開發人員希望的那樣簡單或復雜。一個簡單的Step可能將數據從文件加載到數據庫中,需要很少或不需要代碼(取決於使用的實現)。更復雜的 Step可能具有作為處理的一部分應用的復雜業務規則。與 a 一樣Job, a Step有一個個體StepExecution與 unique 相關 JobExecution,如下圖所示:

  

  StepExecution

   A StepExecution代表一次嘗試執行 a StepStepExecution 每次Step運行a 時都會創建一個新的,類似於JobExecution. 但是,如果一個步驟因為它之前的步驟失敗而無法執行,則不會為其持久執行。A StepExecution僅在其Step實際啟動時才創建。

  Step執行由StepExecution的對象表示每個執行都包含對其相應步驟和JobExecution事務相關數據的引用,例如提交和回滾計數以及開始和結束時間。此外,每個步驟執行都包含一個ExecutionContext,其中包含開發人員需要在批處理運行中保留的任何數據,例如重新啟動所需的統計信息或狀態信息。

  JobRepository

  JobRepository是上述所有 Stereotypes 的持久性機制。它提供了CRUD操作JobLauncherJob以及Step實現。當 Job第一次啟動,一個JobExecution被從庫中獲得,並且,執行的過程中,StepExecutionJobExecution實施方式是通過將它們傳遞到存儲庫持續。

  使用 Java 配置時,該@EnableBatchProcessing注解提供了一個 JobRepository作為開箱即用自動配置的組件之一

  JobLauncher

   JobLauncher表示一個簡單的接口,用於Job使用給定的 集合 啟動JobParameters

1 public interface JobLauncher {
2 
3 public JobExecution run(Job job, JobParameters jobParameters)
4             throws JobExecutionAlreadyRunningException, JobRestartException,
5                    JobInstanceAlreadyCompleteException, JobParametersInvalidException;
6 }

 

參考文檔:

https://gitee.com/vahala/springbatchlearn

https://blog.csdn.net/cxy_chh/article/details/92062259


免責聲明!

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



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