【问题标题】:Spring Batch: reuse existing service as a readerSpring Batch:重用现有服务作为阅读器
【发布时间】:2015-01-20 10:18:10
【问题描述】:

我想重用一个现有的、事务性的、分页的服务类,它使用 JPA 从数据库中检索项目,在 Spring 批处理作业中,作为阅读器。我想这样做而不是直接使用 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 使用了一个新事务来读取一页数据。上面的帖子说需要这个新事务“以便可以正确执行重试和跳过等功能。”。我还发现这篇与https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-3-skip-and-retry/ 相关的文章说“当读取过程中发生可跳过的异常时,我们只需增加跳过计数并保留异常以供以后调用 SkipListener 的 onSkipInRead 方法(如果已配置)。没有回滚”。所以我假设读者必须对新事务中的记录进行任何读取,这样如果在开始处理块时开始事务的回滚,那么读者不会受到影响。我想知道这是否属实,如果在这种情况下我的适配器应该创建一个新事务,调用该事务中的服务,然后提交该事务,类似于 JpaPagingItemReader 的操作方式。如果这是真的,我想知道为什么框架没有提供任何模板来创建事务,将实际调用委托给服务以检索数据,然后提交事务。

您好, 克里斯蒂

【问题讨论】:

    标签: jpa transactions spring-batch


    【解决方案1】:

    从读者的角度来看,确实没有什么好担心的。您可以在我们的JmsItemReader 中看到,它显然适用于交易商店,我们在ItemReader 本身内没有采取任何额外的预防措施。

    真正重要的是您如何配置您的步骤。配置步骤时,您需要将阅读器标记为事务性,以便 Spring Batch 正确处理回滚。当 Spring Batch 在容错步骤中读取项目时,默认行为是缓冲它们,以便在失败时不会重新读取它们(重试、跳过等)。但是,由于从事务存储中读取的项目与事务相关联(因此在发生回滚时会重置),因此您需要告诉 Spring Batch 在读取项目时不要缓冲它们。

    要将ItemReader 标记为事务性的,您需要将not-quite-well-named 标志is-reader-transactional-queue 设置为true。您可以在此处的文档中阅读有关配置步骤和事务的更多信息:http://docs.spring.io/spring-batch/trunk/reference/html/configureStep.html

    【讨论】:

    • 如果我们可以重用任何步骤的Reader和Processor,有什么办法吗?
    • @Pra_A 请打开另一个问题,我们可以在那里回答。
    • stackoverflow.com/questions/63296065/… - 在这里创建了问题。请指导。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2012-01-08
    • 2019-05-04
    • 2016-02-11
    • 2019-06-04
    • 2014-02-24
    • 2013-11-26
    相关资源
    最近更新 更多