SpringBatch從入門到放棄001- HelloWorld

2021-01-11 鵬哥歪說

SpringBatch從入門到放棄001- HelloWorld

經常有人問我,有沒有一個 Spring Batch 的例子可以參考一下,之前的我的回答一般是百度自己找,太多了。但是後來我發現因為 Spring Batch的版本太穩定,網上的例子大部分都是基於2.X,3.X版本的,還有就是對應的 Spring Boot 的版本也是比較老的。針對這種情況,我決定根據最新 release(4.1.2)的官方文檔,來寫一套最新的例子,供朋友參考。

Spring Boot 集成了 Spring Batch,如果想在程序鍾啟用 Spring Batch 的話,只需要添加@EnableBatchProcessing 註解即可,Spring Boot 會根據內置的 @BatchAutoConfiguration引入必要的配置。

Spring Boot 官方文檔中關於 Spring Batch 的描述

下邊我們就來基於 Spring Boot 搭建一個 Hello World 的 Spring Batch。我先假想一個簡單的需求:讀取某一個目錄的文件,加工一下,再寫入另外一個文件(原諒一個理工科直男只能想到這麼一個傻逼需求)。

Step 1: 新建一個 Spring Boot 的工程

我們通過 IDEA新建一個 Spring Boot的工程,在新建的時候引入兩個必要的依賴:

Spring Batch: 運行 Spring BatchMySQL Driver: 需要通過Spring Batch 需要通過資料庫存儲Job 的運行數據

新建 Spring Boot 工程

打開 POM 我們會發現其實引入batch 的 starter。再 starter 裡面封裝了 batch-core。

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

既然引入了 MySQL 的依賴,就配置一個數據源吧,打開 application.properties 文件添加數據源配置(Spring Boot 默認的資料庫連接池,所以只要指定資料庫連接信息就好了),

spring.datasource.username=XXXspring.datasource.password=XXXspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url= jdbc:mysql://localhost:3306/batch_config?zeroDateTimeBehavior=convertToNull我們需要再程序運行的時候初始化資料庫,再application.properties 添加下邊兩個參數。

#程序啟動的時候初始化一個空數據結構

spring.batch.initialize-schema=embedded

#程序啟動的時候不運行任何 Jobspring.batch.job.enabled=false

Step2: 定義Reader/Processor/Writer

根據我們假想出來的需求,我們需要定一個 Reader 來讀取我們的文件,Spring Batch 內置了很多很好用的 Reader,後邊章節我也會詳細的介紹,這裡我們選用FlatFileItemReader來讀取文件,Spring Batch 提供了FlatFileItemReaderBuilder來幫助我們構建FlatFileItemReader,我們只需要指定幾個簡單的屬性,就可以完成一個讀取文件的 Reader。代碼如下:

@StepScope @Bean public ItemReader<String> itemReader(){ //FlatFileItemReader return new FlatFileItemReaderBuilder<String>() .name("simpleFileReader") .resource(new ClassPathResource("batch-data/2019072401.txt")) .lineMapper(new PassThroughLineMapper()) .build(); }

文件讀完之後,我們對讀出來的每一行統一添加一個字符串來模擬Batch 的處理過程。我們通過實現一個匿名來完成添加字符串的操作:

@StepScope @Bean public ItemProcessor<String,String> itemProcessor(){ return new ItemProcessor<String, String>() { @Override public String process(String item) throws Exception { return "[linghuxiong]"+item; } }; }

處理完讀出來的內容之後我們就需要將讀出來的字符串寫到資料庫或者文件系統裡面了,我們假想的需求是寫文件。同樣的 Spring Batch 官方提供了很多內置的 Writer。因為是寫文件,我們選用FlatFileItemWriter作為我們的 Writer,同樣的我們使用FlatFileItemWriterBuilder來構建我們的FlatFileItemWriter[Spring Batch 4 對FlatFileItemWriterBuilder 進行了增強,詳見官方文檔]。

@StepScope @Bean public ItemWriter<String> itemWriter(){ return new FlatFileItemWriterBuilder<String>() .name("simpleFileWriter") .lineAggregator(new PassThroughLineAggregator<String>()) .resource(new FileSystemResource("/Users/eric/Documents/dev/linghuxiong/spring-boot-demo/batch/target/2019072402.txt")) .build(); }

至此我們的Reader/Processor/Writer 就已經構建完畢了,這就相當於零件已經備好,下邊我們通過構建 Step/Job 來組裝我們的 Batch。

Step 3: 構建 Step /Job

再給項目添加@EnableBatchProcessing之後,就會默認將 Batch 需要對象注入到 Context 中,其中就有構建 Step 的StepBuilderFactory和構建 Job 的JobBuilderFactory。下邊我們就用這兩個 Factory 來構建我們的 Step 和 Job。

首先注入這兩個 Factory :

@Autowired JobBuilderFactory jobBuilderFactory; @Autowired StepBuilderFactory stepBuilderFactory;將 Step2 中的零件組裝成一個 Step:

@Bean public Step step1(){ return stepBuilderFactory.get("step1") .<String,String>chunk(2) .reader(itemReader()) .processor(itemProcessor()) .writer(itemWriter()) .build(); }將 Step 放入 Job 中:

@Bean public Job job1(){ return jobBuilderFactory.get("job1").start(step1()).build(); }經過以上兩步,我們的 Job 就定義完成了。下邊我們就來測試一下我們寫的 Job 是否正確:

Step 4: 測試一個 Job

Spring Batch 4.X 提供了一個 @SpringBatchTest 會幫助我們構建一個 Batch 的執行環境,比如:JobLauncherTestUtils/JobRepositoryTestUtils 兩個類。

@RunWith(SpringRunner.class)@SpringBatchTest@SpringBootTestpublic class JobTest { @Autowired private JobLauncherTestUtils jobLauncherTestUtils; @Autowired private JobRepositoryTestUtils jobRepositoryTestUtils; … … … …}

在測試我們的Job 之前,我們需要先清空我們的測試庫,這樣就不會因為上一次的失敗,而引入的髒數據來影響我們這一次的測試。

@Before public void clearMetadata() { jobRepositoryTestUtils.removeJobExecutions(); }

編寫一個簡單的測試 CASE,運行我們的 JOB,並判單是否正常結束:

@Test public void testJob() throws Exception { // given JobParameters jobParameters = jobLauncherTestUtils.getUniqueJobParameters(); // when JobExecution jobExecution = jobLauncherTestUtils.launchJob(jobParameters); // then Assert.assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus()); }

好了,截止到先,我們的 Hello World 的所有代碼都已經編寫結束了。整體的項目結構如下:

項目結構

運行我們Junit Case , 運行成功之後就會在 Writer 指定的文件目錄下邊生成我們處理之後的文件。

運行效果

同時在我們配置的資料庫中,會初始化Batch 框架自己所需要的表:

資料庫創建的表

相關焦點

  • Spring Batch 入門教程
    maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.codenotfound</groupId> <artifactId>spring-batch-hello-world
  • SpringBatch從入門到放棄002- 核心概念1
    Spring -batchSpringBatch從入門到放棄002- 核心概念1上一篇我們通過一個例子簡單介紹了一下 Spring Batch,讓大家有個簡答的概念,今天我們來看 Spring batch 裡面具體的概念。
  • SpringBatch從入門到放棄011- 一個典型的資料庫分片處理的例子
    參考[SpringBatch從入門到放棄001- HelloWorld]。Step 2: 定義我們的分片規則回憶我們的需求,資料庫有100條記錄,需要分5片執行,怎麼個分法?這裡就需要對這100條記錄的數據結構有一定的了解了。因為鵬哥自己的建的測試數據,所以鵬哥知道這是一個ID連續的100條記錄,因此只要按照ID分就可以了。
  • Spring Batch 批處理框架技巧
    引入依賴首先我們需要引入對Spring Batch的依賴,在pom.xml文件加入下面的代碼:<dependency>    <groupId>org.springframework.batch</groupId>    <artifactId>spring-batch-core
  • 通過例子講解Spring Batch入門,優秀的批處理框架
    2 Spring Batch的概念知識2.1 分層架構Spring Batch的分層架構圖如下:可以看到它分為三層,分別是:Application應用層:包含了所有任務batch jobs和開發人員自定義的代碼,主要是根據項目需要開發的業務流程等。
  • 機器學習入門之 HelloWorld
    本文介紹一些機器學習的入門知識,從安裝環境到跑通機器學習入門程序MNIST demo。我的筆記本是技持NVIDIA顯卡的,可以安裝cuda,GPU比CPU快很多,不過筆記本的顯存不大,小模型還可以跑,大模型建議在本地用CPU跑通,到Tesla平臺上訓練。
  • 春節充電系列:李宏毅2017機器學習課程學習筆記08之「Hello World」 of Deep Learning
    /www.bilibili.com/video/av15889450/index_1.html李宏毅機器學習筆記8 「Hello World」 of Deep Learning在我們最開始學習c語言的時候,第一個程序自然是hello
  • helloworld
    helloworld 休閒益智 大小: 1.77M
  • C++基礎總結(一):從「hello world」入門C++!
    最近對C++的基礎知識進行了大匯總,當然這是精簡版的,但是篇幅也不少,所以今天先分享一下hello world,建議大家收藏慢慢學習,同時希望對大家的C++學習有所幫助。C++ 是一種靜態類型的、編譯式的、通用的、大小寫敏感的、不規則的程式語言,支持過程化編程、面向對象編程和泛型編程。C++ 被認為是一種中級語言,它綜合了高級語言和低級語言的特點。
  • Spring Batch真是個優秀的批處理框架,用完愛不釋手!
    2 Spring Batch的概念知識2.1 分層架構Spring Batch的分層架構圖如下:通過例子講解Spring Batch入門,優秀的批處理框架可以看到它分為三層,分別是:Application應用層:包含了所有任務batch jobs和開發人員自定義的代碼,主要是根據項目需要開發的業務流程等
  • 一文輕鬆搞定批處理框架 Spring Batch
    應用層包括所有的batch任務和用戶開發的代碼。核心層包括在運行期運行一個任務所需要的類,例如:JobLauncher,Job和Step的實現。應用和核心層都在基礎設施層之上,基礎設施層包括通用的讀寫器(readers and writers)以及如RetryTemplate等服務。
  • 從「Hello world!」入門C語言!
    好了,現在開始今天的正題:作為C語言的入門,第一步當然是輸出「Hello world!」啦。具體代碼如下:①#include <stdio.h >②void main ()③{④printf("Hello world !")
  • Spring Batch 4.3.0-M2 發布,批處理應用編寫框架
    Spring Batch 提供了一個名為 spring.batch.job.active 的度量,該度量給出了當前活動作業的數量。但是直到現在該指標仍無法讓用戶知道當前正在激活哪些特定作業。此版本豐富了度量標準標籤以實現此目標。3.
  • 程序'猿'的「hello,world!」是什麼梗?
    一日,飯後突生雅興,一番磨墨擬紙,並點上了上好的檀香,頗有王羲之風範,又具顏真卿氣勢,定神片刻,潑墨揮毫,鄭重地寫下:hello world很多人不了解程式設計師的人都覺得毫無笑點,其實如果你知道大多程式設計師學編程時第一課的內容時就明白了。
  • Spring MVC簡介
    Spring MVC的設計是圍繞DispatcherServlet展開的,DispatcherServlet負責將請求派發到特定的handler。通過可配置的handler mappings、view resolution、locale以及theme resolution來處理請求並且轉到對應的視圖。
  • 從AT&T彙編語言的HelloWorld說起
    # Hello world with asm.section .data hello: .ascii "Hello World!, %ecx #helloworld字符串的地址傳遞給ecx寄存器movl $13, %edx #把helloworld字符串的長度13傳遞給edx寄存器int $0x80 #觸發0x80中斷, 具體請看##系統中斷##小節的詳細說明movl $1, %eax #把立即數
  • SpringBoot第一個程序,HelloWorld
    1、首先打開我們的IDEA工具,點擊Create New Project新建一個項目2、點擊左側的Spring Initializr,選擇相應的jdk版本信息,默認的Default打上小點點,點擊next3、==細節==:在最下面的package的地方默認是com.huagege.springboot-01-helloworld
  • Spring Batch 4.1.0.RC1,用於編寫批處理應用的框架
    源碼下載 https://github.com/spring-projects/spring-batch/releases/tag/4.1.0.RC1
  • kafka入門(原理-搭建-簡單使用)
    圖上有個細節需要注意,producer 到 broker 的過程是 push,也就是有數據就推送到 broker,而 consumer 到 broker 的過程是 pull,是通過 consumer 主動去拉數據的,而不是 broker 把數據主懂發送到 consumer 端的。二、kafka的linux基本搭建此處還是給大家一個連結很是優秀!
  • 為什麼學習編程寫第一個程序都是「hello world」
    "hello world!"說起這個問候語,可能只要接觸過編程的朋友都不陌生,沒錯,它就是所有程式語言學習初期默認的第一個程序,已經成了不是規則的規則!那麼學習編程,為什麼第一個程序是寫」hello world"呢?