首页 文章

Spring Batch:重用现有服务作为读者

提问于
浏览
0

我想重用一个现有的事务性分页服务类,它在Spring批处理作业中使用JPA作为读取器从数据库中检索项目 . 我想这样做而不是直接使用JpaPagingItemReader,因为JPA查询构建起来比较复杂,而且服务已经提供了这个功能 .

我的问题是在通过此服务开发Spring批处理适配器时应该考虑的事项是什么 . 虽然参考文档http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html#pagingItemReaders有一个关于重用现有服务的部分,但它没有说明使用这种事务服务的约束(如果有的话) .

现在,我查看了JpaPagingItemReader作为构建阅读器的示例,我想出了一些问题,我无法在文档或stackoverflow中找到netiher的答案,尽管这篇文章https://stackoverflow.com/a/26549831/4473261帮助了 .

我注意到的第一件事是JpaPagingItemReader使用新事务来读取数据页面 . 上面的帖子说需要这个新的交易"so that features like retry and skip can be correctly performed." . 我也发现这篇文章与https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-3-skip-and-retry/有关,即"when a skippable exception occurs during reading, we just increase the skip count and keep the exception for a later call on the onSkipInRead method of the SkipListener, if configured. There’s no rollback" . 所以我假设读者必须在新事务中对记录进行任何读取,这样如果在开始处理块时开始回滚事务,那么读者就不会受到影响 . 我想知道这是否属实,如果在这种情况下我的适配器应该创建一个新事务,调用该事务内的服务然后提交事务,类似于JpaPagingItemReader如何做 . 如果创建事务的框架提供的任何模板,则委托服务实际调用以检索数据,然后提交事务 .

问候,克里斯蒂

1 回答

  • 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

相关问题