我想重用一个现有的事务性分页服务类,它在Spring批处理作业中使用JPA作为读取器从数据库中检索项目。我想这样做而不是直接使用JpaPagingItemReader,因为JPA查询构建起来比较复杂,而且服务已经提供了这个功能。
我的问题是在通过此服务开发Spring批处理适配器时应该考虑的事项。虽然参考文档http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html#pagingItemReaders有一个关于重用现有服务的部分,但它没有说明有关使用此类交易服务的约束(如果有的话)。
现在,我查看了JpaPagingItemReader作为构建阅读器的示例,我想出了一些问题,我无法在文档或stackoverflow中为netiher找到答案,尽管这篇文章{{3帮助。
我注意到的第一件事是JpaPagingItemReader使用新事务来读取数据页面。上面的帖子说需要这个新的交易"因此可以正确执行重试和跳过等功能。"。我还发现这篇文章与问题https://stackoverflow.com/a/26549831/4473261有关,它说"当在阅读过程中发生可跳过的异常时,我们只是增加跳过次数并保留异常以便稍后调用onSkipInRead方法。 SkipListener,如果已配置。没有回滚"。所以我假设读者必须在新事务中对记录进行任何读取,这样如果在开始处理块时开始回滚事务,那么读者就不会受到影响。我想知道这是否属实,如果在这种情况下我的适配器应该创建一个新的事务,调用该事务内的服务然后提交事务,类似于JpaPagingItemReader如何做。如果这是真的,我想知道为什么框架提供的任何模板都没有创建事务,委托服务实际调用以检索数据然后提交事务。
问候, 克里斯提
答案 0 :(得分:1)
从读者的角度来看,真的没什么值得关注的。您可以在JmsItemReader
中看到,这显然适用于交易商店,我们不会在ItemReader
内采取任何其他预防措施。
真正重要的是如何配置步骤。配置步骤时,您需要将阅读器标记为事务性,以便Spring Batch正确处理回滚。当Spring Batch在容错步骤中读取项目时,默认行为是缓冲它们,以便在失败时重新读取它们(重试,跳过等)。但是,由于从事务存储读取的项与事务相关联(因此在发生回滚时重置),因此需要告诉Spring Batch在读取项时不缓冲这些项。
要将ItemReader
标记为事务性,您可以将名称不太好的标记is-reader-transactional-queue
设置为true。您可以在此处阅读有关配置步骤和事务的更多信息:http://docs.spring.io/spring-batch/trunk/reference/html/configureStep.html