当前位置: 首页 > 知识库问答 >
问题:

Spring批处理:将现有服务重用为读取器

韦衡
2023-03-14

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

我的问题是,在这个服务上开发Spring批处理html" target="_blank">适配器时,我应该考虑哪些事情。尽管参考文档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所做的那样。如果这是真的,我想知道为什么创建事务的框架没有提供任何模板,将实际调用委托给服务以检索数据,然后提交事务。

你好,克里斯蒂

共有1个答案

澹台镜
2023-03-14

从读者的角度来看,真的没有什么值得关注的。您可以在我们的JMSitemReader中看到,我们并没有在ItemReader本身中采取任何额外的预防措施,该JMSitemReader显然与事务性存储一起工作。

真正重要的是如何配置步骤。配置步骤时,需要将读取器标记为事务性,以便Spring批处理正确处理回滚。当Spring批处理在一个fault tollerant步骤中读取项时,默认的行为是缓冲它们,这样它们就不会在失败时被重新读取(重试、跳过等)。但是,由于从事务存储区读取的项与事务绑定(因此在发生回滚时重置),您需要告诉Spring Batch不要在读取项时对其进行缓冲。

要将ItemReader标记为事务性的,可以将名称不太好的标志is-reader-transactional-queue设置为true。您可以在以下文档中了解更多关于配置步骤和事务的信息:http://docs.spring.io/spring-batch/trunk/reference/html/configurestep.html

 类似资料:
  • 我知道匹配模式解析器,这是Spring批处理提供的。我需要关于如何构造批处理作业的帮助,以便它可以读取循环中的记录类型5和记录类型6。

  • 我正在使用JpaPagingItemReaderBuilder查询一个DB,结果被插入到另一个DB中。 查询返回的结果没有任何问题,但我得到了一个错误与读取器的返回,在处理器中,您可以检查我的编码和错误下面。 有谁能给我一点启示吗?为什么我不能处理结果?

  • 我正在windows机器上运行Jenkins.war进程的Jenkins。“java-jar Jenkins.war”。如果我关闭服务的命令提示符,詹金斯就会倒下。我希望Jenkins在命令提示符关闭的情况下仍然处于启动状态,甚至在机器重新启动之后,这个Jenkins也将被启动。我们如何在windows机器上做到这一点?

  • 我正在尝试创建一个应用程序,该应用程序使用spring-batch-excel扩展名来读取用户通过web界面上传的Excel文件,以便解析Excel文件中的地址。 当代码运行时,没有错误,但我得到的只是我日志中的以下内容。即使我的处理器和Writer中都有log/syso(它们从未被调用过,我所能想象的是它没有正确读取文件,也没有返回要处理/写入的数据)。是的,这个文件有数据,实际上有几千条记录。

  • 我有一个批处理步骤 读取器和处理器流程如何工作?读取器是读取块并等待处理器处理它,还是一次读取所有块。

  • 我必须使用Spring Batch配置一个作业。是否可以有一个单线程的项目阅读器,但多线程处理器? 在这种情况下,ItemReader将通过从数据库中读取工作项(通过执行预定义的查询)来创建要处理的工作项,每个处理器将并行处理项/块。