2017-02-16 161 views
4

有很多示例使用FlatFileItemReader以及TaskExecutor。我提供样品下方(包括XML和Java的配置):使用FlatFileItemReader和TaskExecutor(线程安全)

我已经与大的CSV写作与XML配置(GB大小),数据库用它我的自我开箱即用的JpaItemWriter。即使没有设置save-state = false或进行任何特殊处理,似乎也没有问题。

现在,FlatFileItemReader记录为为非线程安全的

我的猜测是JpaItemWriter通过持续集合来“覆盖”问题,即如果hashCode()equals()覆盖了实体的业务密钥,则集合没有重复。但是,即使如此,仅仅通过非线程安全的读取和处理来防止重复是不够的。

请您澄清一下:在已分配TaskExecutor的Tasklet中使用开箱即用的FlatFileItemReader是否正确/正确/安全?无论作家如何。如果不是,我们如何在理论上解释当使用JPAItemWriter时没有错误?

PS:这个例子链接,我上面给,使用FlatFileItemReader用的TaskExecutor没有在所有可能的线程安全问题提...

+0

我可能是错的,但你问''FlatFileItemReader'不是'JpaItemWriter'是线程安全的吗? – CKing

+0

我的问题更一般。我提供了2个链接,其中一个FlatFileItemReader与TaskExecutor和不同的Writer一起使用,没有任何特殊的线程安全处理。此外,我提供了自己的经验,并试图给出理论上的解释,说明JpaItemWriter在某些情况下如何“隐藏”问题。所以换句话说,我的问题是:我们应该如何正确使用它,如果最终能够按照原样使用TaskExecutor。 – kmandalas

+0

你的意思是'JpaItemReader'或'JpaItemWriter'? –

回答

3

TL; DR它是安全的使用FlatFileItemReader配备了一TaskExecutorWriter是线程安全的。 (假设您目前不关心重新启动作业,重试步骤,跳过等)。

更新:现在有JIRA即正式确认saveState需要被设置为false(即禁止重启)如果一个人想使用FlatFileItemReader在一个线程安全的方式TaskExecutor


让我们先通过看什么Spring documentation说,关于使用多线程的步骤与TaskExecutor从马口听到它。

Spring Batch提供ItemWriter和 ItemReader的一些实现。通常他们会在Javadoc中说是否线程安全 ,或者您必须采取哪些措施才能避免并发的 环境中的问题。如果在Javadoc中没有的信息,您可以检查 实施情况,看看是否有任何状态

现在让我们来解决您的问题:

能否请您澄清:这是正确的/正确的/安全地使用 开箱即用的FlatFileItemReader在Tasklet中已分配 TaskExecutor?无论作家如何。如果不是,那么在理论上如何解释 在使用JPAItemWriter时没有错误?

声明“作者的遗漏”不正确。您使用的Writer必须是线程安全的。 JpaItemWriter对于Java文档是线程安全的,可以安全地与不是线程安全的FlatFileItemReader一起使用。解释JpaItemWriter是如何线程安全的将会使这个答案很长。如果您对特定编写者如何处理线程安全感兴趣,我建议您发布另一个问题。 (如前所述由Spring Batch的文档以及)

PS:这个例子链接,我上面给,使用FlatFileItemReader用的TaskExecutor没有在所有可能的线程安全问题提..

如果您看一下相关性示例,您会看到它们明确修改CoherenceBatchWriter.java图6。他们首先制作mapBatch局部变量,以便多个线程拥有自己的Map副本。此外,如果您深入了解API,您应该发现返回的NamedCache将是线程安全的。

由于Writer没有做任何事情来避免竞争条件,您提供的第二个链接看起来真的很冒险。这个例子确实是一个多线程步骤的不正确使用。


+0

感谢您提供的所有信息。但是,鉴于面向块的处理风格,如果'FlatFileItemReader'不是线程安全的,是不是不可能有不同的线程读取同一行文件?这样,Writer(即使它是线程安全的)会尝试最后写入重复的项目。这就是为什么我没有把重点放在作家部分。 – kmandalas

+0

@kmandalas是的,这是可能的,但如果作者是线程安全的,这个问题是无效的,所以一切都很好。如果你看看* Cohernece *的'Writer'实现,你会发现确保不会有任何重复的写入,因为写入者写入线程安全的Map和Map并不会执行写操作。不允许重复的密钥。此外,'JpaItemWriter'是线程安全的,并且会为您提供与重复插入IMO相同的隔离。所以即使你没有强调它,作者也很重要。 – CKing