簡體   English   中英

我可以同時使用 Spring 異步和 Java8 並行 stream 嗎

[英]Can I use Spring Async and Java8 parallel stream together

基本上,使用一個調度程序我想同時處理多個 csv 文件。 文件中可以有 1 到 10K 條記錄。 我想並行處理每個文件,如果記錄> 1K,我想並行處理該文件的記錄。

假設有 10 個不同線程的 1OK 記錄。

我的任務是從我有 FTP 文件路徑 URL 的地方讀取一個數據庫表。 並處理這些 csv 文件,驗證 csv 數據並最終保存到 DB 表中。

List<CSVFileRecords> files = filesRepo.findAll();

files.foreach(file->processFile(file));

@Async
void processFile(file) {
  InputStream i = getStream(file); //download file
  List<Data> data = csvParser.csvToBean(i); //consider 10K records

  List<List<Data>> dataList = getListOfList(data);
    
  dataList.parallelStream().foreach(data-> processData(data));

}

List<Response> processData(data) {
    validate();
    saveAll();
 }

不,它不會像你期望的那樣工作。

因為, files.foreach(file->processFile(file));

不錯的選擇是

// 10 - Number of threads

ExecutorService executorService = Executors.newFixedThreadPool(10);

files.foreach(file -> executorService.execute(() -> processFile(file)));

需要注意的是,在您使用 parallelStream 的進程方法內部,它將隨后根據數據的大小創建更多線程。

一個好的做法是在處理之前對數據進行分區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM