gpt4 book ai didi

spring-batch - 读取平面文件时,多线程步骤如何在内部工作?

转载 作者:行者123 更新时间:2023-12-04 07:21:38 27 4
gpt4 key购买 nike

我正在寻找 10 GB 的 Flatfile。为此,我选择使用 ThreadPoolTask​​Executor 使我的步骤成为多线程的。
我想知道这 4 个工作线程是如何在内部工作的?一个线程如何不读取另一个线程读取的数据。如果有人可以解释它是如何在内部工作的,那将是非常有帮助的。

@Bean
@StepScope
public FlatFileItemReader<Transaction> fileTransactionReader(@Value("#{jobParameters['inputFlatFile']}") Resource resource) {

return new FlatFileItemReaderBuilder<Transaction>()
.saveState(false)
.resource(resource)
.delimited()
.names(new String[] {"account", "amount", "timestamp"})
.fieldSetMapper(fieldSet -> {
Transaction transaction = new Transaction();
transaction.setAccount(fieldSet.readString("account"));
transaction.setAmount(fieldSet.readBigDecimal("amount"));
transaction.setTimestamp(fieldSet.readDate("timestamp", "yyyy-MM-dd HH:mm:ss"));

return transaction;
})
.build();
}
代码 -
@Bean
public Job multithreadedJob() {
return this.jobBuilderFactory.get("multithreadedJob")
.start(step1())
.build();
}

@Bean
public Step step1() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(4);
taskExecutor.setMaxPoolSize(4);
taskExecutor.afterPropertiesSet();

return this.stepBuilderFactory.get("step1")
.<Transaction, Transaction>chunk(100)
.reader(fileTransactionReader(null))
.writer(writer(null))
.taskExecutor(taskExecutor)
.build();
}

最佳答案

FlatFileItemReader本身不是线程安全的,因为它扩展了 AbstractItemCountingItemStreamItemReader其 javadoc 声明 Subclasses are inherently not thread-safe .所以严格来说,你应该把它包裹在 SynchronizedItemStreamReader 中.另见:Can I use FlatfileItemReader with Taskexecutor?
话虽如此,如果你

  • 不关心可重启性,
  • 不在乎行号,
  • 不要使用需要状态的映射,
  • 套装saveStatefalse ,
  • 并且不要更改阅读器的默认值 bufferedReaderFactory ,

  • 那么读者只是一个薄薄的包装
  • BufferedReader谁的方法readLine为每个 FlatFileItemReader::read 调用,
  • 和一个 LineMapper将每一行映射到目标类型

  • BufferedReader是线程安全的,这使您的读者可以在多线程步骤中有效地安全调用。
    但要注意:Spring Batch API 不对读者的线程安全做出任何 promise 。事实上恰恰相反。因此,多线程行为至少在理论上会在 future 版本中发生变化。此外,上面列出的许多条件有一天可能不再适用于您的实现。因此,使用 SynchronizedItemStreamReader真的很推荐。
    另见 Can spring batch multi-threaded step be used safely if number of items in file are very less?

    关于spring-batch - 读取平面文件时,多线程步骤如何在内部工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68455400/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com