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

Spring批处理-在处理器上禁用ItemReader缓存跳过,并再次处理筛选的行

强保臣
2023-03-14

几乎我的所有批处理都有一个读取器(JpaPagingItemReader从我的数据库读取数据)、一个处理器和一个创建XML文件的写入器。这3个部分都在一个步骤,我的块大小通常在50左右。

当发生可跳过的异常时,我注意到了两个副作用,我想知道是否有一种方法可以改变这些默认行为=>

  1. 我通常在阅读器中读取JPA实体,并将它们发送到处理器,在那里我将更改它们的属性以更新数据库。但是,当发生可跳过的异常并且再次处理实体时,它们就会变成分离的实体,并且不再与数据库匹配,因为它们的状态是在前一个进程中更新的,而数据库已经回滚。我知道reader的结果是缓存的,并且文档说明ItemReader的结果应该保持“幂等”(未更改)。但是有没有一种方法可以禁用ItemReader的缓存,并在重新处理元素时强制加载一个新的实体呢?它将更适合我的用例。
  2. 我注意到,当一个元素被过滤(处理器返回null),然后发生了可跳过的异常时,在回滚之后不会再次处理过滤的元素。有办法改变吗?

在问这个问题之前,我在stackoverflow、spring批处理文档和google上搜索了很多,但我没有找到我的答案。

提前感谢您的宝贵帮助,并非常感谢Spring批处理的开发人员提供这一伟大的工具!

共有1个答案

夔光霁
2023-03-14
  1. 但是否有方法禁用ItemReader的缓存

readerTransactionalQueue是您要查找的内容(尽管名称中的“queue”不适用于您的情况,但这仍然是禁用缓存的原因)。

我看不出有什么明显的办法可以改变这一点。这就是它从一开始的工作方式,我想(看看最后的修改日期)。但这对我来说是有意义的,为什么要重新处理一个项目,如果它是过滤的?除非处理器不是幂等的,否则该项目将再次被重新过滤。

 类似资料:
  • 我定义了一个块,提交间隔为10,跳过限制为10。处理器类通过应用一些算术运算来操作字段。其中一条记录(比如第6条记录)在处理器类中发生异常。在此之后,再次处理1到5条记录,跳过第6条记录,处理7到10条记录,并将其写入XML(自定义XML编写器类)。由于处理器处理1-5条记录两次,因此预期字段值计算两次是错误的。您能否建议一种解决方案,让处理器只处理一次记录,只跳过失败的记录,并将处理后的记录写入

  • 关于skip,我有一个非常基本的问题。我正在使用spring示例提供的spring batch simple cli项目,并试图理解跳过行为。它有一个非常基本的示例读取器,可以读取字符串数组(我将其修改为从Hellowworld 1到Hellowworld 10的10个字符串列表中读取),还有一个基本的编写器,可以登录到控制台。writer抛出java。每写一次都有例外。我在作业配置中增加了4个跳

  • 我有一个工作,处理项目的大块(1000个)。这些项目被封送到一个JSON有效负载中,并作为一个批处理发布到远程服务(在一个HTTP POST中所有1000个)。有时远程服务陷入困境,连接超时。我为此设置了跳过 如果一个块失败了,批处理重试这个块,但一次一个项目(为了找出是哪个项目导致了失败)但在我的情况下,没有一个项目导致了失败,这是整个块作为块成功或失败的情况,应该作为块重试(事实上,下降到单项

  • 当我使用Spring批处理管理运行长时间运行的批处理作业的多个实例时,它会在达到jobLauncher线程池任务执行程序池大小后阻止其他作业运行。但是从cron中提取多个工作似乎效果不错。下面是作业启动器配置。 Spring批处理管理员Restful API是否使用不同于xml配置中指定的作业启动器?

  • 这似乎是一个愚蠢的问题。我正在尝试为Spring Batch作业存储库(Spring Batch 2.1.7)配置Oracle10g数据库,我能够使用在core中的org/spring框架/批/core/schema-oracle10g.sql可用的脚本创建表。我还将属性batch.data.source.init设置为false。 在干净的数据库上,我的批处理程序运行良好,成功地创建了所有批处理

  • 我尝试了另一个解决方案,使用自定义的FlatItemReader,我重写了close()方法,在关闭后删除文件。这个解决方案发生了一个奇怪的事情,我的close方法被调用了两次,有些时候我可以删除文件,有些时候我不能删除它... 请参阅下面的日志: 我的close方法的代码: 我的BatchConfig.java: filedeletingTasklet.java