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

Spring batch Spring批处理-在处理器跳过时禁用ItemReader缓存,并再次处理筛选的行,spring-batch,Spring Batch,我已经使用springbatch一段时间了,今天我尝试增强我的批处理,使它们更加防弹。所以我启用了.fault容错和.skipLimit/.skip,但没有启用任何重试策略 几乎所有批处理都有一个读卡器(从数据库读取数据的JpaPagingItemReader)、一个处理器和一个创建XML文件的编写器。这三个部分都在一个步骤中,我的块大小通常在50左右 我注意到当发生可跳过的异常时有两个副作用,我想知道是否有办法更改这些默认行为=> 我通常在我的阅读器中读取JPA实体,将它们发送到我的处理器,在

我已经使用springbatch一段时间了,今天我尝试增强我的批处理,使它们更加防弹。所以我启用了.fault容错和.skipLimit/.skip,但没有启用任何重试策略

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

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

  • 我通常在我的阅读器中读取JPA实体,将它们发送到我的处理器,在那里我将更改它们的属性以更新我的数据库。但是,当发生可跳过的异常并再次处理实体时,它们将成为分离的实体,并且不再与数据库匹配,因为它们的状态在上一个过程中更新,而数据库已回滚。 我知道读取器的结果是缓存的,文档中说ItemReader的结果应该保持“幂等”(未更改)。但有没有办法禁用ItemReader的缓存,并在再次处理元素时强制加载新实体?它更适合我的用例
  • 我注意到,当一个元素被过滤时(处理器返回null),然后发生一个可跳过的异常,在回滚之后,过滤的元素不会再次被处理。有没有办法改变这种状况 在问这个问题之前,我在stackoverflow、spring批处理文档和google上搜索了很多,但找不到答案

    提前感谢您的宝贵帮助,也非常感谢SpringBatch的开发人员提供了这个伟大的工具

  • 但是有没有办法禁用ItemReader的缓存
  • 是您正在寻找的(尽管名称中的“队列”不适用于您的案例,但这仍然是禁用缓存的原因)

  • 我注意到,当一个元素被过滤时(处理器返回null),然后发生一个可跳过的异常,在回滚之后,过滤的元素不会再次被处理。有没有办法改变这种状况

  • 我看不出有什么明显的办法可以改变这一点。我想这是从一开始(看看上次的修改日期)。但这对我来说是有意义的,如果一个项目被过滤了,为什么要重新处理它呢?无论如何,此项都将重新筛选,除非处理器不是幂等的。

    因此我启用了.faultlerant和.skipLimit/.skip,但我没有启用任何重试策略。
    :SkipPolicy和RetryPolicy在容错步骤的上下文中是不同的。您是否尝试过使用
    .retry/.retryLimit
    有没有办法禁用ItemReader的缓存
    :我想这就是您要查找的内容(尽管名称中有“队列”)。你试过了吗?非常感谢你的回答!跳过比重试更适合我:)但ReaderistransaConationalQueue似乎正是我想要的,我会尝试一下,谢谢!你对第二个问题(过滤元素被忽略)有什么想法吗不客气。我为这两个问题添加了更详细的答案。希望对您有所帮助。谢谢您提供更详细的答案!我想重新处理过滤后的项目,因为我仍然对这些项目执行操作。至少我在报表表中插入一行,表示该项已被过滤。有时我仍然在数据库中写入一些数据,比如更新上次查看的日期。如我所见(以及在我实现批处理时),读取器负责读取数据,处理器负责处理数据(包括编辑DB数据),而writer负责生成输出,在我的例子中,主要是XML文件。当然,按原样实现并跳过过滤项是有意义的,但我认为,如果启用容错,我希望批处理能够像以前一样运行,但不读取第一次传递时生成错误的元素,这也是有道理的。为此,我需要启用readerTransactionalQueue,并且需要另一个标志来启用对过滤项的处理。如果你认为我的观点是正确的,并且这样的标志可以添加到Spring批处理中,那么你会让我成为最快乐的人:-)否则我会自己调整,有一个类似的标志用于名为的处理器。你试过了吗?根据文档,它似乎并没有达到我想要的效果,因为如果我禁用它(默认情况下是启用的),Spring批处理将不会在跳过的情况下再次处理。我需要的是Spring批处理再次处理所有内容(除了错误):-)是的,我感谢您宝贵的时间:-)我将看看我是否可以调整批处理,或者我是否可以请求项目的功能,或者可能做PR!