日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解批處理框架之Spring Batch

瀏覽:24日期:2023-07-07 13:48:36
目錄一、Spring Batch的概念知識1.1、分層架構1.2、關鍵概念1.2.1、JobRepository1.2.2、任務啟動器JobLauncher1.2.3、任務Job1.2.4、步驟Step1.2.5、輸入——處理——輸出二、代碼實例2.1、基本框架2.2、輸入——處理——輸出2.2.1、讀取ItemReader2.2.2、處理ItemProcessor2.2.3、輸出ItremWriter2.3、Step2.4、Job2.5、運行三、監聽Listener一、Spring Batch的概念知識1.1、分層架構

Spring Batch的分層架構圖如下:

詳解批處理框架之Spring Batch

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

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

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

詳解批處理框架之Spring Batch

1.2.1、JobRepository

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

1.2.2、任務啟動器JobLauncher

負責啟動任務Job。

1.2.3、任務Job

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

詳解批處理框架之Spring Batch

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

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

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

1.2.4、步驟Step

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

詳解批處理框架之Spring Batch

通過定義Step來組裝Job可以更靈活地實現復雜的業務邏輯。

1.2.5、輸入——處理——輸出

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

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

二、代碼實例

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

2.1、基本框架

添加依賴:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId></dependency><dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope></dependency>

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

入口主類:

@SpringBootApplication@EnableBatchProcessingpublic class PkslowBatchJobMain { public static void main(String[] args) {SpringApplication.run(PkslowBatchJobMain.class, args); }}

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

領域實體類Employee:

package com.pkslow.batch.entity;public class Employee { String id; String firstName; String lastName;}

對應的csv文件內容如下:

id,firstName,lastName

1,Lokesh,Gupta

2,Amit,Mishra

3,Pankaj,Kumar

4,David,Miller

2.2、輸入——處理——輸出2.2.1、讀取ItemReader

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

@Value('input/inputData*.csv')private Resource[] inputResources;@Beanpublic MultiResourceItemReader<Employee> multiResourceItemReader(){ MultiResourceItemReader<Employee> resourceItemReader = new MultiResourceItemReader<Employee>(); resourceItemReader.setResources(inputResources); resourceItemReader.setDelegate(reader()); return resourceItemReader;}@Beanpublic FlatFileItemReader<Employee> reader(){ FlatFileItemReader<Employee> reader = new FlatFileItemReader<Employee>(); //跳過csv文件第一行,為表頭 reader.setLinesToSkip(1); reader.setLineMapper(new DefaultLineMapper() { { setLineTokenizer(new DelimitedLineTokenizer() {{ //字段名 setNames(new String[] { 'id', 'firstName', 'lastName' });} }); setFieldSetMapper(new BeanWrapperFieldSetMapper<Employee>() {{ //轉換化后的目標類 setTargetType(Employee.class);} }); } }); return reader;}

這里使用了FlatFileItemReader,方便我們從文件讀取數據。

2.2.2、處理ItemProcessor

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

public ItemProcessor<Employee, Employee> itemProcessor() { return employee -> { employee.setLastName(employee.getLastName().toUpperCase()); return employee; };}2.2.3、輸出ItremWriter

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

private Resource outputResource = new FileSystemResource('output/outputData.csv');@Beanpublic FlatFileItemWriter<Employee> writer(){ FlatFileItemWriter<Employee> writer = new FlatFileItemWriter<>(); writer.setResource(outputResource); //是否為追加模式 writer.setAppendAllowed(true); writer.setLineAggregator(new DelimitedLineAggregator<Employee>() { { //設置分割符 setDelimiter(','); setFieldExtractor(new BeanWrapperFieldExtractor<Employee>() {{ //設置字段 setNames(new String[] { 'id', 'firstName', 'lastName' });} }); } }); return writer;}2.3、Step

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

@Beanpublic Step csvStep() { return stepBuilderFactory.get('csvStep').<Employee, Employee>chunk(5) .reader(multiResourceItemReader()) .processor(itemProcessor()) .writer(writer()) .build();}

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

2.4、Job

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

@Beanpublic Job pkslowCsvJob() { return jobBuilderFactory .get('pkslowCsvJob') .incrementer(new RunIdIncrementer()) .start(csvStep()) .build();}2.5、運行

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

詳解批處理框架之Spring Batch

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

三、監聽Listener

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

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

public class PkslowWriteListener implements ItemWriteListener<Employee> { private static final Log logger = LogFactory.getLog(PkslowWriteListener.class); @Override public void beforeWrite(List<? extends Employee> list) {logger.info('beforeWrite: ' + list); } @Override public void afterWrite(List<? extends Employee> list) {logger.info('afterWrite: ' + list); } @Override public void onWriteError(Exception e, List<? extends Employee> list) {logger.info('onWriteError: ' + list); }}

把實現的監聽器listener整合到Step中去:

@Beanpublic Step csvStep() { return stepBuilderFactory.get('csvStep').<Employee, Employee>chunk(5) .reader(multiResourceItemReader()) .listener(new PkslowReadListener()) .processor(itemProcessor()) .listener(new PkslowProcessListener()) .writer(writer()) .listener(new PkslowWriteListener()) .build();}

執行后看一下日志:

詳解批處理框架之Spring Batch

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

以上就是詳解Spring Batch入門之優秀的批處理框架的詳細內容,更多關于Spring Batch 批處理框架的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
伊人影院久久| 国产日韩精品视频一区二区三区| 国产精品多人| 六月丁香综合在线视频| 欧美91在线|欧美| 国产一区二区三区不卡视频网站 | 国产亚洲欧洲| 欧美精品自拍| 在线视频亚洲欧美中文| 日本不卡一二三区黄网| 国产欧美日韩亚洲一区二区三区| 久久成人av| 日本一区二区高清不卡| 久久一区二区中文字幕| 夜夜嗨av一区二区三区网站四季av| 日韩视频一区| 国产亚洲电影| 日本欧美不卡| 久久国产精品毛片| 国产亚洲高清在线观看| 97精品一区二区| 久久久久欧美精品| 亚洲成人三区| 日本伊人久久| 日韩大片在线观看| 亚洲影院天堂中文av色| 久久亚州av| 激情91久久| 日韩av一区二区三区四区| 欧美aⅴ一区二区三区视频| 欧美日中文字幕| 久久国内精品自在自线400部| 国产一区丝袜| 亚洲欧美视频| 久久久久久久欧美精品| 中文字幕色婷婷在线视频| 狠狠色狠狠色综合日日tαg| 国产欧美高清视频在线| 日韩1区在线| 免费精品视频最新在线| 高潮久久久久久久久久久久久久| aa国产精品| 精品国产三区在线| 视频在线观看91| 国产精品高颜值在线观看| 免费不卡在线观看| 亚洲一区资源| 久久狠狠久久| 丝袜美腿亚洲色图| av在线最新| 日本国产欧美| 99热免费精品| 日韩免费福利视频| 国产精品久久久久久久免费软件| 91精品蜜臀一区二区三区在线 | 日韩专区在线视频| 日本不良网站在线观看| 久久国产免费看| 麻豆9191精品国产| 日本在线啊啊| 国产免费播放一区二区| 久久国产精品毛片| 久久久蜜桃一区二区人| 精品久久美女| 国产欧美日韩一级| 香蕉久久一区| 伊人久久亚洲影院| 日韩中文视频| sm捆绑调教国产免费网站在线观看| 日韩精品一区二区三区免费视频 | 久久久一本精品| 国产精品99精品一区二区三区∴ | 伊人影院久久| 日韩欧美中文| 国产一区二区三区四区二区| 日本一区二区中文字幕| 国产亚洲精品v| 国产伊人精品| 91精品推荐| 色老板在线视频一区二区| 久久久久九九精品影院| 欧美亚洲自偷自偷| 婷婷综合成人| 香蕉精品999视频一区二区| av资源中文在线天堂| 精品亚洲a∨| 国产精品地址| 美女久久99| 久久精品国产网站| 免费在线亚洲欧美| 国产精品mm| 国产调教精品| 欧美日韩亚洲一区二区三区在线| 亚洲精品美女| 日本中文字幕一区二区| 日韩精品免费观看视频| 日本中文字幕不卡| 国产欧美一区二区三区米奇| 久久国产人妖系列| 国产欧美一级| 国产精品主播| 国产精品v日韩精品v欧美精品网站| 国产九一精品| 久久精品国产99| 成人国产精品一区二区免费麻豆| 精品高清久久| 欧美精品日日操| 99视频精品全国免费| 久久国产中文字幕| 亚洲国产一区二区三区在线播放| 欧美午夜不卡影院在线观看完整版免费| 欧美不卡高清| 蜜臀a∨国产成人精品| 亚洲精品国产精品粉嫩| 最近国产精品视频| 日韩精品视频中文字幕| 国产欧美日韩亚洲一区二区三区| 国产激情精品一区二区三区| 国产一区二区三区91| 欧美成人a交片免费看| 久久亚洲专区| 中文字幕一区日韩精品| 91精品国产自产精品男人的天堂| 国产美女久久| 岛国av在线播放| 亚洲精品1区| 日韩中文一区二区| 久久这里只有精品一区二区| 日韩精品欧美激情一区二区| 亚洲精品网址| 欧美午夜三级| 日韩欧美不卡| 一级欧美视频| 久草精品视频| 亚洲天堂久久| 日本成人中文字幕在线视频| 国产一区二区三区不卡视频网站 | av一区二区高清| 久久成人精品| 日韩中文欧美在线| 久久激情综合网| 成人日韩在线| 综合亚洲视频| 午夜一级久久| 天堂网在线观看国产精品| 啪啪亚洲精品| 久久五月天小说| 国产亚洲精品美女久久久久久久久久| 日韩精品不卡一区二区| 免费人成网站在线观看欧美高清| 国产欧美一区二区三区米奇| 久久精品成人| 日韩不卡一二三区| 91精品综合| 欧美天堂一区| 欧美午夜精品一区二区三区电影| 青草国产精品| 99精品网站| 国产欧美啪啪| 国产一区91| 美女视频一区在线观看| 午夜一级在线看亚洲| 国产夫妻在线| 国产乱人伦丫前精品视频| 国产一区欧美| 精品日韩在线| 亚洲精品影视| 欧美日韩亚洲在线观看| 国产精品久久乐| 丝袜美腿一区二区三区| 欧美激情国产在线| 69堂免费精品视频在线播放| 亚州av乱码久久精品蜜桃| 麻豆国产一区| 日韩成人精品一区二区三区 | 久久久久久久欧美精品| 国产 日韩 欧美 综合 一区| 亚洲欧洲免费| 亚洲婷婷在线| 国产美女高潮在线| 国产欧美日韩精品高清二区综合区 | 欧美在线亚洲综合一区| 精品一区不卡| 国产欧美一区二区精品久久久| 久久成人一区| 午夜国产一区二区| 日韩中文字幕高清在线观看| 国产精品欧美一区二区三区不卡 | 美女国产精品久久久| 四虎国产精品免费久久| 亚洲欧洲日本mm| 欧美中文字幕一区二区| 日韩精品电影| 福利视频一区| 国产精品久久久久久久久久妞妞| 久久亚洲图片| 模特精品在线| 亚洲作爱视频| 中文一区在线| 日韩午夜电影|