问题描述
我试图了解当在块步骤的编写器中引发异常时发生的情况。 我有一个JdbcItemReader,一个处理器和一个JPAItemWriter。 我使用了JdbcItemReader,因为处理器会修改在读取器的where条件中也使用的字段的值。
如果在JPAItemWriter中引发了异常,则事务被标记为已回滚,将块大小设置为1,并且Spring Batch会一次向处理器发送一项以了解正在引发异常的项目。
重试阶段发送到处理器的项目没有原始字段值是否正常?它具有在处理器第一次运行期间修改的值。
这样,处理器的第二次运行可能与第一次运行不同。
任何人都可以帮助我了解发生了什么事吗?
解决方法
这很正常,因为在重试期间会缓存项目。如果要禁用该功能,则需要设置FaultTolerantStepBuilder#processorNonTransactional()标志。
也就是说,这里要提到两个重要的细节:
- 您应该正确实现
equals
和hashcode
,因为这些方法用于标识重试中的项目。 - 在容错步骤中,
ItemProcessor
实现应是幂等的,如参考文档的Fault tolerance部分所述