成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Batch真是個優(yōu)秀的批處理框架,用完愛不釋手!

開發(fā) 后端
Spring Batch是一個輕量級的、完善的批處理框架,作為Spring體系中的一員,它擁有靈活、方便、生產可用的特點。在應對高效處理大量信息、定時處理大量數(shù)據(jù)等場景十分簡便。

1 前言

Spring Batch是一個輕量級的、完善的批處理框架,作為Spring體系中的一員,它擁有靈活、方便、生產可用的特點。在應對高效處理大量信息、定時處理大量數(shù)據(jù)等場景十分簡便。

結合調度框架能更大地發(fā)揮Spring Batch的作用。

2 Spring Batch的概念知識

2.1 分層架構

Spring Batch的分層架構圖如下:

通過例子講解Spring Batch入門,優(yōu)秀的批處理框架

可以看到它分為三層,分別是:

  •  Application應用層:包含了所有任務batch jobs和開發(fā)人員自定義的代碼,主要是根據(jù)項目需要開發(fā)的業(yè)務流程等。
  •  Batch Core核心層:包含啟動和管理任務的運行環(huán)境類,如JobLauncher等。
  •  Batch Infrastructure基礎層:上面兩層是建立在基礎層之上的,包含基礎的讀入reader和寫出writer、重試框架等。

2.2 關鍵概念

理解下圖所涉及的概念至關重要,不然很難進行后續(xù)開發(fā)和問題分析。

通過例子講解Spring Batch入門,優(yōu)秀的批處理框架

2.2.1 JobRepository

專門負責與數(shù)據(jù)庫打交道,對整個批處理的新增、更新、執(zhí)行進行記錄。所以Spring Batch是需要依賴數(shù)據(jù)庫來管理的。

2.2.2 任務啟動器JobLauncher

負責啟動任務Job。

2.2.3 任務Job

Job是封裝整個批處理過程的單位,跑一個批處理任務,就是跑一個Job所定義的內容。

通過例子講解Spring Batch入門,優(yōu)秀的批處理框架

上圖介紹了Job的一些相關概念:

  •  Job:封裝處理實體,定義過程邏輯。
  •  JobInstance:Job的運行實例,不同的實例,參數(shù)不同,所以定義好一個Job后可以通過不同參數(shù)運行多次。
  •  JobParameters:與JobInstance相關聯(lián)的參數(shù)。
  •  JobExecution:代表Job的一次實際執(zhí)行,可能成功、可能失敗。

所以,開發(fā)人員要做的事情,就是定義Job。

2.2.4 步驟Step

Step是對Job某個過程的封裝,一個Job可以包含一個或多個Step,一步步的Step按特定邏輯執(zhí)行,才代表Job執(zhí)行完成。

通過例子講解Spring Batch入門,優(yōu)秀的批處理框架

通過定義Step來組裝Job可以更靈活地實現(xiàn)復雜的業(yè)務邏輯。

2.2.5 輸入——處理——輸出

所以,定義一個Job關鍵是定義好一個或多個Step,然后把它們組裝好即可。而定義Step有多種方法,但有一種常用的模型就是輸入——處理——輸出,即Item Reader、Item Processor和Item Writer。比如通過Item Reader從文件輸入數(shù)據(jù),然后通過Item Processor進行業(yè)務處理和數(shù)據(jù)轉換,最后通過Item Writer寫到數(shù)據(jù)庫中去。

Spring Batch為我們提供了許多開箱即用的Reader和Writer,非常方便。

3 代碼實例

理解了基本概念后,就直接通過代碼來感受一下吧。整個項目的功能是從多個csv文件中讀數(shù)據(jù),處理后輸出到一個csv文件。

3.1 基本框架

添加依賴: 

  1. <dependency>  
  2.   <groupId>org.springframework.boot</groupId>  
  3.   <artifactId>spring-boot-starter-batch</artifactId>  
  4. </dependency>  
  5. <dependency>  
  6.   <groupId>com.h2database</groupId>  
  7.   <artifactId>h2</artifactId>  
  8.   <scope>runtime</scope>  
  9. </dependency> 

需要添加Spring Batch的依賴,同時使用H2作為內存數(shù)據(jù)庫比較方便,實際生產肯定是要使用外部的數(shù)據(jù)庫,如Oracle、PostgreSQL。

入口主類: 

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

也很簡單,只是在Springboot的基礎上添加注解@EnableBatchProcessing。

領域實體類Employee: 

  1. package com.pkslow.batch.entity;  
  2. public class Employee {  
  3.     String id;  
  4.     String firstName;  
  5.     String lastName;  

對應的csv文件內容如下: 

  1. id,firstName,lastName  
  2. 1,Lokesh,Gupta  
  3. 2,Amit,Mishra  
  4. 3,Pankaj,Kumar  
  5. 4,David,Miller 

3.2 輸入——處理——輸出

3.2.1 讀取ItemReader

因為有多個輸入文件,所以定義如下: 

  1. @Value("input/inputData*.csv")  
  2. private Resource[] inputResources;  
  3. @Bean  
  4. public MultiResourceItemReader<Employee> multiResourceItemReader()  
  5.   MultiResourceItemReader<Employee> resourceItemReader = new MultiResourceItemReader<Employee>();  
  6.   resourceItemReader.setResources(inputResources);  
  7.   resourceItemReader.setDelegate(reader()); 
  8.   return resourceItemReader;  
  9.  
  10. @Bean 
  11. public FlatFileItemReader<Employee> reader()  
  12.  
  13.   FlatFileItemReader<Employee> reader = new FlatFileItemReader<Employee>();  
  14.   //跳過csv文件第一行,為表頭  
  15.   reader.setLinesToSkip(1);  
  16.   reader.setLineMapper(new DefaultLineMapper() {  
  17.     {  
  18.       setLineTokenizer(new DelimitedLineTokenizer() {  
  19.         {  
  20.           //字段名 
  21.            setNames(new String[] { "id", "firstName", "lastName" });  
  22.         }  
  23.       });  
  24.       setFieldSetMapper(new BeanWrapperFieldSetMapper<Employee>() {  
  25.         {  
  26.           //轉換化后的目標類  
  27.           setTargetType(Employee.class);  
  28.         }  
  29.       });  
  30.     }  
  31.   });  
  32.   return reader;  

這里使用了FlatFileItemReader,方便我們從文件讀取數(shù)據(jù)。

3.2.2 處理ItemProcessor

為了簡單演示,處理很簡單,就是把最后一列轉為大寫: 

  1. public ItemProcessor<Employee, Employee> itemProcessor() {  
  2.   return employee -> {  
  3.     employee.setLastName(employee.getLastName().toUpperCase()); 
  4.      return employee;  
  5.   };  

3.2.3 輸出ItremWriter

比較簡單,代碼及注釋如下: 

  1. private Resource outputResource = new FileSystemResource("output/outputData.csv");  
  2. @Bean  
  3. public FlatFileItemWriter<Employee> writer()  
  4.  
  5.   FlatFileItemWriter<Employee> writer = new FlatFileItemWriter<>();  
  6.   writer.setResource(outputResource);  
  7.   //是否為追加模式 
  8.    writer.setAppendAllowed(true);  
  9.   writer.setLineAggregator(new DelimitedLineAggregator<Employee>() {  
  10.     {  
  11.       //設置分割符 
  12.        setDelimiter(",");  
  13.       setFieldExtractor(new BeanWrapperFieldExtractor<Employee>() {  
  14.         {  
  15.           //設置字段  
  16.           setNames(new String[] { "id", "firstName", "lastName" });  
  17.         }  
  18.       });  
  19.     }  
  20.   });  
  21.   return writer;  

3.3 Step

有了Reader-Processor-Writer后,就可以定義Step了: 

  1. @Bean  
  2. public Step csvStep() {  
  3.   return stepBuilderFactory.get("csvStep").<Employee, Employee>chunk(5)  
  4.     .reader(multiResourceItemReader())  
  5.     .processor(itemProcessor())  
  6.     .writer(writer())  
  7.     .build();  

這里有一個chunk的設置,值為5,意思是5條記錄后再提交輸出,可以根據(jù)自己需求定義。

3.4 Job

完成了Step的編碼,定義Job就容易了: 

  1. @Bean  
  2. public Job pkslowCsvJob() {  
  3.   return jobBuilderFactory  
  4.     .get("pkslowCsvJob")  
  5.     .incrementer(new RunIdIncrementer())  
  6.     .start(csvStep())  
  7.     .build();  

3.5 運行

完成以上編碼后,執(zhí)行程序,結果如下:

通過例子講解Spring Batch入門,優(yōu)秀的批處理框架

成功讀取數(shù)據(jù),并將最后字段轉為大寫,并輸出到outputData.csv文件。

4 監(jiān)聽Listener

可以通過Listener接口對特定事件進行監(jiān)聽,以實現(xiàn)更多業(yè)務功能。比如如果處理失敗,就記錄一條失敗日志;處理完成,就通知下游拿數(shù)據(jù)等。

我們分別對Read、Process和Write事件進行監(jiān)聽,對應分別要實現(xiàn)ItemReadListener接口、ItemProcessListener接口和ItemWriteListener接口。因為代碼比較簡單,就是打印一下日志,這里只貼出ItemWriteListener的實現(xiàn)代碼: 

  1. public class PkslowWriteListener implements ItemWriteListener<Employee> {  
  2.     private static final Log logger = LogFactory.getLog(PkslowWriteListener.class);  
  3.     @Override  
  4.     public void beforeWrite(List<? extends Employee> list) {  
  5.         logger.info("beforeWrite: " + list);  
  6.     }  
  7.     @Override  
  8.     public void afterWrite(List<? extends Employee> list) {  
  9.         logger.info("afterWrite: " + list);  
  10.     }  
  11.     @Override  
  12.     public void onWriteError(Exception e, List<? extends Employee> list) {  
  13.         logger.info("onWriteError: " + list);  
  14.     }  

把實現(xiàn)的監(jiān)聽器listener整合到Step中去: 

  1. @Bean  
  2. public Step csvStep() {  
  3.   return stepBuilderFactory.get("csvStep").<Employee, Employee>chunk(5)  
  4.     .reader(multiResourceItemReader())  
  5.     .listener(new PkslowReadListener())  
  6.     .processor(itemProcessor())  
  7.     .listener(new PkslowProcessListener())  
  8.     .writer(writer())  
  9.     .listener(new PkslowWriteListener())  
  10.     .build();  

執(zhí)行后看一下日志:

通過例子講解Spring Batch入門,優(yōu)秀的批處理框架

這里就能明顯看到之前設置的chunk的作用了。Writer每次是處理5條記錄,如果一條輸出一次,會對IO造成壓力。

5 總結

Spring Batch還有許多優(yōu)秀的特性,如面對大量數(shù)據(jù)時的并行處理。本文主要入門介紹為主,不一一介紹,后續(xù)會專門講解。 

 

責任編輯:龐桂玉 來源: java版web項目
相關推薦

2011-03-31 14:22:28

Chrome插件

2021-01-18 09:55:46

Spring代碼Java

2011-09-16 09:06:20

Smalltalk

2021-02-02 21:42:30

VS Code編輯器開發(fā)

2021-04-25 10:15:38

Python編程語言軟件包

2021-04-13 10:07:08

Python軟件包編程語言

2021-01-24 11:55:40

spring升華代碼的技巧開發(fā)

2011-05-12 09:12:16

Ubuntu 11.0

2017-05-24 18:00:13

AndroidAndroid DatView

2010-12-08 09:59:10

CSS

2011-04-19 09:08:09

web工具項目管理

2016-05-05 10:54:53

Android開發(fā)應用

2009-08-29 08:41:07

Windows 7新功能

2023-07-04 08:19:25

IDEA插件

2024-12-17 15:00:00

Python代碼

2021-01-11 08:21:34

spring升華代碼的技巧開發(fā)

2023-07-18 08:46:34

開發(fā)必備軟件工具

2021-12-09 13:30:17

微軟

2021-01-20 06:29:42

JS工具操作符

2013-05-06 22:52:10

智能手機交互方式用戶體驗
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 婷婷色在线 | 成人性视频免费网站 | 91欧美精品 | 亚洲国产中文字幕 | 在线观看国产三级 | 精品国产一区二区国模嫣然 | www.99热| 国产精品美女久久久av超清 | 91毛片在线观看 | 欧美一级黄色片在线观看 | 成人毛片视频免费 | 久久精品亚洲 | 成人亚洲视频 | 一区二区三区四区在线播放 | 操皮视频 | 免费成人高清 | 国产精品一区二区视频 | ww亚洲ww亚在线观看 | 日本一区二区视频 | 久久精品国产免费看久久精品 | 日韩精品免费一区二区在线观看 | 日本a视频| 国产乱码精品一区二区三区忘忧草 | 欧美成人一区二区三区 | 国产精品美女久久久久久免费 | 麻豆久久久 | 亚洲3p| 免费久久99精品国产婷婷六月 | 国产精品福利在线 | 四虎在线播放 | 美女人人操 | 自拍偷拍精品 | 人人澡视频 | 欧美一级在线 | 久久精品综合网 | 国产精品久久久久久高潮 | 亚洲欧美视频在线观看 | 91久久精品日日躁夜夜躁欧美 | 亚洲人成人一区二区在线观看 | 精品欧美一区二区三区久久久 | 四虎在线观看 |