[英]Using FlatFileItemReader with a TaskExecutor (Thread Safety)
有很多例子使用FlatFileItemReader
和TaskExecutor
。 我在下面提供了示例(包括XML和Java Config):
我已经将自己的XML配置用于大型CSV(GB大小),使用开箱即用的JpaItemWriter
写入数据库。 即使没有设置save-state = false或采取任何特殊处理,似乎也没有问题。
现在, FlatFileItemReader
被记录为不是线程安全的 。
我的猜测是,如果hashCode()
和equals()
覆盖了实体的业务密钥, JpaItemWriter
通过持久化集合即“覆盖”该问题,即没有重复的集合。 但是,即使这样,由于非线程安全的读取和处理,也不足以防止重复。
您能否澄清一下:在已分配TaskExecutor的FlatFileItemReader
中使用开箱即用的FlatFileItemReader
是否正确/正确/安全? 无论作家如何。 如果没有,我们怎么能在理论上解释使用JPAItemWriter
时缺少错误?
PS:我在上面给出的示例链接,使用FlatFileItemReader
和TaskExecutor,但没有提到所有可能的线程安全问题......
TL; DR如果Writer
是线程安全的,那么使用带有TaskExecutor
的FlatFileItemReader
是安全的。 (假设您不关心重启作业,重试步骤,跳过等等)。
更新:现在有一个JIRA正式确认saveState
需要设置为false
(即禁用可重启性),如果想要以线程安全的方式使用FlatFileItemReader
和TaskExecutor
。
让我们首先通过查看Spring文档中有关使用TaskExecutor
多线程步骤的内容来从马口中听到它。
Spring Batch提供了ItemWriter和ItemReader的一些实现。 通常他们在Javadocs中说是否是线程安全的,或者你需要做些什么来避免并发环境中的问题。 如果Javadocs中没有信息,您可以检查实现以查看是否存在任何状态
我们现在解决您的问题:
您能否澄清一下:在已分配TaskExecutor的Tasklet中使用开箱即用的FlatFileItemReader是否正确/正确/安全? 无论作家如何。 如果没有,我们怎么能在理论上解释使用JPAItemWriter时缺少错误?
声明“ 作家的Regardess ”是不正确的。 您使用的Writer
必须是线程安全的。 JpaItemWriter是针对Java文档的线程安全的,可以安全地与不是线程安全的FlatFileItemReader
一起使用。 解释JpaItemWriter
如何是线程安全的将使这个答案很长。 如果您对特定作者如何处理线程安全感兴趣,我建议您发布另一个问题。 (正如Spring Batch文档所述)
PS:我在上面给出的示例链接,使用FlatFileItemReader和TaskExecutor,但没有提到所有可能的线程安全问题。
如果你看一下coherence示例,你会看到它们清楚地修改了图6中的CoherenceBatchWriter.java
。 他们首先创建mapBatch
局部变量,以便多个线程拥有自己的Map
副本。 此外,如果您深入研究Coherence API,您会发现返回的NamedCache
是线程安全的。
你提供的第二个链接看起来非常冒险,因为Writer
没有做任何事情来避免竞争条件 。 这个例子确实是多线程步骤的错误使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.