kma*_*las 7 java multithreading flat-file thread-safety spring-batch
FlatFileItemReader与一起使用了很多示例TaskExecutor。我在下面提供了示例(都带有XML和Java Config):
我已将自己的XML配置用于大型CSV(GB大小)的开箱即用JpaItemWriter。即使不设置save-state = false或进行任何特殊处理,似乎也没有问题。
现在,FlatFileItemReader已记录为不是线程安全的。
我的猜测是,JpaItemWriter通过持久保存集(即如果hashCode()和equals()覆盖实体的业务密钥,则没有重复)的集合来“发现”问题。但是,即使这样,由于非线程安全的读取和处理,也无法防止重复。
您能否澄清一下:FlatFileItemReader在分配了TaskExecutor的Tasklet 中使用开箱即用的方法是否正确/正确/安全?不论作家。如果没有,我们如何在理论上解释JPAItemWriter使用a时没有错误?
PS:我上面给出的示例链接FlatFileItemReader与TaskExecutor一起使用,而没有提及所有可能的线程安全问题...
TL;DR如果 a是线程安全的,则将 a 与 a 一起使用是安全FlatFileItemReader的。(假设您目前不关心重新启动作业、重试步骤、跳过等)。TaskExecutorWriter
更新:现在有一个JIRA正式确认如果想以线程安全的方式使用a ,则saveState需要将其设置为(即禁用可重新启动性)。falseFlatFileItemReaderTaskExecutor
让我们首先通过查看Spring 文档中关于使用多线程步骤和TaskExecutor.
Spring Batch 提供了 ItemWriter 和 ItemReader 的一些实现。通常,他们会在 Javadoc 中说明它们是否是线程安全的,或者您必须采取哪些措施来避免并发环境中出现问题。如果Javadocs中没有信息,可以检查实现看看是否有状态
现在我们来解答您的问题:
您能否澄清一下:在分配了 TaskExecutor 的 Tasklet 中使用开箱即用的 FlatFileItemReader 是否正确/正确/安全?与作者无关。如果不是,我们如何从理论上解释使用 JPAItemWriter 时没有错误?
“作者的观点”的说法是错误的。您Writer使用的必须是线程安全的。根据Java文档,JpaItemWriter是线程安全的,并且可以安全地与非线程安全的对象一起使用。解释线程安全如何会使这个答案变得很长。如果您对特定作者如何处理线程安全感兴趣,我建议您发布另一个问题。(正如Spring Batch文档中提到的)FlatFileItemReaderJpaItemWriter
PS:我上面给出的示例链接将 FlatFileItemReader 与 TaskExecutor 一起使用,而没有提及所有可能的线程安全问题。
如果您看一下一致性示例,您会发现它们明显修改了图 6CoherenceBatchWriter.java中的。他们首先创建 局部变量,以便多个线程拥有自己的 this 副本。此外,如果您进一步深入研究Coherence API,您应该会发现返回的结果是线程安全的。mapBatchMapNamedCache
您提供的第二个链接看起来确实很危险,因为它Writer没有做任何事情来避免竞争条件。该示例确实是多线程步骤的错误使用。