【发布时间】: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