块处理模式下的Spring Batch事务回滚

问题描述

我试图了解当在块步骤的编写器中引发异常时发生的情况。 我有一个JdbcItemReader,一个处理器和一个JPAItemWriter。 我使用了JdbcItemReader,因为处理器会修改在读取器的where条件中也使用的字段的值。

如果在JPAItemWriter中引发了异常,则事务被标记为已回滚,将块大小设置为1,并且Spring Batch会一次向处理器发送一项以了解正在引发异常的项目。
重试阶段发送到处理器的项目没有原始字段值是否正常?它具有在处理器第一次运行期间修改的值。
这样,处理器的第二次运行可能与第一次运行不同。

任何人都可以帮助我了解发生了什么事吗?

解决方法

这很正常,因为在重试期间会缓存项目。如果要禁用该功能,则需要设置FaultTolerantStepBuilder#processorNonTransactional()标志。

也就是说,这里要提到两个重要的细节:

  • 您应该正确实现equalshashcode,因为这些方法用于标识重试中的项目。
  • 在容错步骤中,ItemProcessor实现应是幂等的,如参考文档的Fault tolerance部分所述