激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - Spring Batch真是個優秀的批處理框架,用完愛不釋手!

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

2020-11-04 00:11java版web項目 JAVA教程

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

1 前言

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

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

2 Spring Batch的概念知識

2.1 分層架構

Spring Batch的分層架構圖如下:

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

通過例子講解Spring Batch入門,優秀的批處理框架

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

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

2.2 關鍵概念

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

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

通過例子講解Spring Batch入門,優秀的批處理框架

2.2.1 JobRepository

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

2.2.2 任務啟動器JobLauncher

負責啟動任務Job。

2.2.3 任務Job

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

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

通過例子講解Spring Batch入門,優秀的批處理框架

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

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

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

2.2.4 步驟Step

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

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

通過例子講解Spring Batch入門,優秀的批處理框架

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

2.2.5 輸入——處理——輸出

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

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

3 代碼實例

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

3.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  

@EnableBatchProcessing  

public 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 

3.2 輸入——處理——輸出

3.2.1 讀取ItemReader

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

@Value("input/inputData*.csv")  

private Resource[] inputResources;  

@Bean  

public MultiResourceItemReader<Employee> multiResourceItemReader()  

  MultiResourceItemReader<Employee> resourceItemReader = new MultiResourceItemReader<Employee>();  

  resourceItemReader.setResources(inputResources);  

  resourceItemReader.setDelegate(reader()); 

  return resourceItemReader;  

 

@Bean 

public 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,方便我們從文件讀取數據。

3.2.2 處理ItemProcessor

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

public ItemProcessor<Employee, Employee> itemProcessor() {  

  return employee -> {  

    employee.setLastName(employee.getLastName().toUpperCase()); 

     return employee;  

  };  

3.2.3 輸出ItremWriter

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

private Resource outputResource = new FileSystemResource("output/outputData.csv");  

@Bean  

public 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;  

3.3 Step

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

@Bean  

public Step csvStep() {  

  return stepBuilderFactory.get("csvStep").<Employee, Employee>chunk(5)  

    .reader(multiResourceItemReader())  

    .processor(itemProcessor())  

    .writer(writer())  

    .build();  

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

3.4 Job

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

@Bean  

public Job pkslowCsvJob() {  

  return jobBuilderFactory  

    .get("pkslowCsvJob")  

    .incrementer(new RunIdIncrementer())  

    .start(csvStep())  

    .build();  

3.5 運行

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

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

通過例子講解Spring Batch入門,優秀的批處理框架

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

4 監聽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中去:

@Bean  

public 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真是個優秀的批處理框架,用完愛不釋手!

通過例子講解Spring Batch入門,優秀的批處理框架

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

5 總結

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

原文地址:https://mp.weixin.qq.com/s/mNNMkVQGALypJLVMTlyv0Q

延伸 · 閱讀

精彩推薦
  • JAVA教程Java實現簡單樹結構

    Java實現簡單樹結構

    這篇文章主要為大家詳細介紹了Java實現簡單樹結構的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Java開發-擱淺1932020-07-26
  • JAVA教程Spring Boot項目使用Flyway的詳細教程

    Spring Boot項目使用Flyway的詳細教程

    這篇文章主要介紹了Spring Boot項目使用Flyway,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    dreamingodd1522020-07-25
  • JAVA教程Java數據結構與算法之棧(動力節點Java學院整理)

    Java數據結構與算法之棧(動力節點Java學院整理)

    這篇文章主要介紹了Java數據結構與算法之棧,棧是先進后出的數據的結構,本文通過文字說明與實例代碼相結合的形式給大家介紹的非常詳細,需要的朋友...

    動力節點4642020-09-10
  • JAVA教程詳解Spring Boot中使用Flyway來管理數據庫版本

    詳解Spring Boot中使用Flyway來管理數據庫版本

    這篇文章主要介紹了詳解Spring Boot中使用Flyway來管理數據庫版本,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 ...

    翟永超4312020-07-25
  • JAVA教程java利用Socket實現聊天室功能實例

    java利用Socket實現聊天室功能實例

    這篇文章主要介紹了java利用Socket實現聊天室功能實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。 ...

    Eric_ley3062020-08-04
  • JAVA教程java驗證碼生成具體代碼

    java驗證碼生成具體代碼

    這篇文章主要為大家分享了java驗證碼生成具體代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下 ...

    賣蠟筆的小新4812020-04-20
  • JAVA教程javaweb分頁原理詳解

    javaweb分頁原理詳解

    這篇文章主要為大家詳細介紹了javaweb分頁的原理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    第九種格調的人生3572020-09-08
  • JAVA教程java中關于移位運算符的demo與總結(推薦)

    java中關于移位運算符的demo與總結(推薦)

    下面小編就為大家帶來一篇java中關于移位運算符的demo與總結(推薦)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    jingxian3662020-05-07
591
主站蜘蛛池模板: xxxx69hd一hd72| 亚洲va国产va | 欧洲精品久久久 | 国产精品九九久久一区hh | 日韩剧情片 | 久久久久日本精品一区二区三区 | 在线小视频国产 | 免费在线观看毛片视频 | 久色免费视频 | 毛片在线播放视频 | 亚洲综合精品成人 | 免费看黄色一级片 | 精品一区二区免费视频视频 | 国产成人在线观看免费网站 | www.狠狠插.com| 欧美视频一二区 | 国产精品呻吟 | 国产艳妇av视国产精选av一区 | 国产黄色一级大片 | 午夜精品久久久久久中宇 | 国产午夜精品视频免费不卡69堂 | 色综合久久久久久久久久 | 91免费高清视频 | 久久国产成人午夜av浪潮 | 欧美1区2区在线观看 | 污污黄 | 久久色伦理资源站 | 91久久夜色精品国产网站 | 午夜久久久精品一区二区三区 | av电影在线观看网址 | 欧美亚洲国产成人综合在线 | 成人毛片免费在线 | 亚洲成人在线免费观看 | 欧美精品一级 | 性爱视频在线免费 | 亚洲精品一区二区三区免 | 激情视频在线播放 | 国产一区二区三区四区五区在线 | 91成人一区 | 免费a级黄色片 | 黄色网络免费看 |