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

Spring批处理重试策略和跳过策略问题

颜楚青
2023-03-14

我有以下步骤在批处理工作。

    <batch:step id="parse-step">
        <batch:tasklet>
            <batch:chunk reader="xmlCommonReader"
                         processor="xmlCommonProcessor"
                         writer="xmlCommonWriter"
                         commit-interval="1">
                <batch:skip-policy>
                    <bean class="org.springframework.batch.core.step.skip.AlwaysSkipItemSkipPolicy" scope="step"/>
                </batch:skip-policy>
                <batch:retry-policy>
                    <bean class="org.springframework.retry.policy.NeverRetryPolicy" scope="step"/>
                </batch:retry-policy>
            </batch:chunk>
        </batch:tasklet>
        <batch:next on="FAILED" to="file-failed-step"/>
        <batch:next on="COMPLETED" to="file-success-step"/>
        <batch:listeners>
            <batch:listener ref="parseStepExecutionListener"/>
            <batch:listener ref="parseStepSkipListener"/>
        </batch:listeners>
    </batch:step>

当某个异常抛出时,我在parseStepSkipListener中捕捉他并登录数据库。

我期待以下行为:

  1. 作业已启动
  2. 执行前面的步骤
  3. 开始执行解析步骤
  4. 阅读项目
  5. 进程项
    1. 哦,异常。
    2. 捕获异常,登录数据库,转到下一个块(读取、处理、写入)。
    1. 作业已启动
    2. 执行前面的步骤
    3. 开始执行解析步骤
    4. 阅读项目
    5. 进程项
      1. 哦,异常。
      2. 进程项
      3. 写入项
        1. 哦,异常。
        2. 捕获异常,登录数据库,转到下一个块(读取、处理、写入)。

        因此,一个数据块尝试处理和写入两次。

共有1个答案

林昱
2023-03-14

寥寥数语:

这是因为当在写步骤中发生错误时,SB不知道哪个对象导致了异常,所以执行回滚,并且最后未提交块的每一项被再次处理/作为小块,以检测哪个对象是主写错误的原因。您可以在这里阅读更多(使用图表)

 类似资料:
  • 我有以下一个批处理的Spring配置。我在生产批处理中遇到过一个问题,当一个特定的用例抛出一个不可跳过的异常时。当我在集成测试中复制用例时,批处理行为仍然很奇怪。当我的batch.commit-interval属性大于1时,将触发重试机制,回滚未提交的块,并再次处理所有以前的记录。当batch-commit-interval设置为1时,一旦抛出不可跳过的异常,批处理就会失败。 我尝试了batch-

  • 在RetryTemplate里面,执行excuter方法是重试还是失败是由RetryPolicy决定的,这也是一个RetryContext工厂.这个RetryTemplate有责任使用当前的策略创建一个RetryContext并且把它注入到RetryCallback在每一次尝试中。回调失败后RetryTemplate必须由RetryPolicy决定使其更新状态(存储在RetryContext中),

  • 在瞬时失效之后做一个尝试它常常有助于在再试一次之前等待一会。因为通常失败是有一些问题引起的它只能通过等待来解决这些问题,如果RetryCallback失败,RetryTemplate可以暂停执行取决于BackoffPolicy在适当的位置 public interface BackoffPolicy { BackOffContext start(RetryContext context);

  • 为了辅助批处理系统的设计和实现、应该通过结构示意图和代码实例的形式为设计师和程序员提供基础的批处理程序构建模块和以及处理模式. 在设计批处理Job时,应该将业务逻辑分解成一系列的步骤,使每个步骤都可以利用以下的标准构建模块来实现: 转换程序(Conversion Applications): 由外部系统提供或需要写入到外部系统的各种类型的文件,我们都需要为其创建一个转换程序, 用来将所提供的事务记

  • 我有一个多项目成绩。 项目A依赖于项目B,但gradle先编译项目A,然后编译项目B。 我的文件:settings.gradle 设计一个build.gradle 当我构建一个应用程序时,会得到错误。但我不知道该不该重复处理策略 错误:

  • 我想用Spring集成创建一个简单的IntegrationFlow,但我遇到了一些困难。 我想创建一个集成流,从Rabbit Mq中的队列中获取消息并将消息发布到endpointRest。 我要处理的问题是,当一个请求失败时,它会继续无休止地重试,如何在这段代码中实现重试策略?例如,我想要3次重试,第一次重试在1秒后,第二次重试在5秒后,第三次重试在1分钟后。