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

跳过情况下禁用Spring批处理单件处理

鞠侯林
2023-03-14

我有一个工作,处理项目的大块(1000个)。这些项目被封送到一个JSON有效负载中,并作为一个批处理发布到远程服务(在一个HTTP POST中所有1000个)。有时远程服务陷入困境,连接超时。我为此设置了跳过

    return steps.get("sendData")
            .<DataRecord, DataRecord> chunk(1000)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .faultTolerant()
            .skipLimit(10)
            .skip(IOException.class)
            .build();

如果一个块失败了,批处理重试这个块,但一次一个项目(为了找出是哪个项目导致了失败)但在我的情况下,没有一个项目导致了失败,这是整个块作为块成功或失败的情况,应该作为块重试(事实上,下降到单项目模式导致远程服务非常生气,它拒绝接受数据。我们不控制远程服务)。

共有1个答案

狄德泽
2023-03-14

让我分两个部分来讨论这个问题。首先,我将解释它的工作方式,然后我将提出一个选项来解决您的问题。

为什么要逐项重试

在您的配置中,您已经指定它是容错的。这样,当在itemwriter中抛出异常时,我们不知道是哪个项导致了异常,因此我们无法跳过/重试它。这就是为什么当我们开始跳过/重试逻辑时,我们逐项执行。

这确实消除了在列表中真正跳过单个项目的能力,但听起来这对您的用例来说是可以的。

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

  • 假设我有一个像这样配置的简单任务: 当抛出MyRetryableException时,我重试了15次,但最后我得到了

  • 问题内容: 为何默认禁用hibernate批处理/ hibernate.order_updates / hibernate.order_inserts?启用批量大小为50时有什么缺点吗?与order_updates / order_inserts参数相同。有没有不启用此功能的用例?使用此功能是否会对性能产生影响? 我只能看到这些设置在需要减少查询数量时很有用,这在应用程序和数据库服务器之间的延迟很

  • 几乎我的所有批处理都有一个读取器(JpaPagingItemReader从我的数据库读取数据)、一个处理器和一个创建XML文件的写入器。这3个部分都在一个步骤,我的块大小通常在50左右。 当发生可跳过的异常时,我注意到了两个副作用,我想知道是否有一种方法可以改变这些默认行为=> 我通常在阅读器中读取JPA实体,并将它们发送到处理器,在那里我将更改它们的属性以更新数据库。但是,当发生可跳过的异常并且

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

  • 我已经将spring batch admin与现有的spring web应用程序集成。我可以使用batch admin屏幕触发/控制作业,并使用Tomcat8进行部署。一切正常,但Spring管理批处理日志在控制台中触发,导致catalina。填写GB。日志样本如下: 我的log4j配置如下: 但我不断地得到日志。你能建议如何禁用/增加日志级别吗?提前谢谢。