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

Spring批次中的控制步骤级别执行

陶法
2023-03-14

根据spring batch中的某些条件,是否可以执行一个步骤或跳过它并继续下一步。例如,批处理作业中有5个步骤,在执行每个步骤之前,我们需要根据数据库中某个列的值检查是否跳过它。需求是通过监听器或其他方式创建通用逻辑,以控制运行时的步骤执行?

我需要在运行时填充下一个属性。示例xml

    <batch:step id="step1" next="stepdecision">
        <batch:tasklet ref="tasklet1" />
    </batch:step>

    <batch:step id="step2" next="stepdecision">
        <batch:tasklet ref="tasklet1" />
    </batch:step>

    <batch:step id="step3" next="stepdecision">
        <batch:tasklet ref="tasklet1" />
    </batch:step>

    <batch:step id="step4" next="stepdecision">
        <batch:tasklet ref="tasklet1" />
    </batch:step>

    <batch:decision id="stepdecision" decider="decider">
        <batch:next on="next" to="#{jobExecutionContext[nextStep]}" />
    </batch:decision>

</batch:job>

<bean id="decider" class="com.bmo.apms.batch.StepFlowDecider">
</bean>
<bean id="tasklet1" class="com.bmo.apms.batch.TestTasklet" />

但它引发了异常:配置问题:元素[step2]无法访问|

我认为spring不允许在运行时绑定下一个属性。请给出建议。

共有2个答案

闻人越
2023-03-14

我实现了这个b创建一个查找下一步的决定器。每一步的下一个属性都是他的决定器,它在运行时将其转发给实际的步骤。

    <batch:decision id="stepdecision" decider="decider">
        <batch:next on="step1" to="step1" />
        <batch:next on="step2" to="step2" />
        <batch:next on="step3" to="step3" />
        <batch:next on="step4" to="step4" />
        <batch:end on="end" />
    </batch:decision>


<batch:next on="step3" to="step3" />
        <batch:next on="step4" to="step4" />
        <batch:end on="end" />
    </batch:decision>

    <batch:step id="step1" next="stepdecision">
        <batch:tasklet ref="tasklet1" />
    </batch:step>

    <batch:step id="step2" next="stepdecision">
        <batch:tasklet ref="tasklet1" />
    </batch:step>

    <batch:step id="step3" next="stepdecision">
        <batch:tasklet ref="tasklet1" />
    </batch:step>

    <batch:step id="step4" next="stepdecision">
        <batch:tasklet ref="tasklet1" />
    </batch:step>
甘西岭
2023-03-14

不要在运行时配置下一个值。配置决策器在运行时返回的内容。这就是决策者的全部意图。

 类似资料:
  • 我最近偶然发现了一个非常扭曲的Spring批次问题。要求如下: 我有两个主要步骤: 第一个从oracle数据库中读取一些数据,从一个表中写入另一个表 第二个基于第一步处理的数据,完成其他一些数据库工作 从设计的角度来看,第一步如下所示: 复合项目编写器: 虽然前两位作者并不复杂,但我的兴趣集中在第三位。 正如您可能已经猜到的,这一个将用于获取之前正在处理的一些数据,以便在我的第二步中进行升级: 问

  • 我正在尝试修复Spring Batch中的一个问题,这个问题最近一直困扰着我们的系统。我们有一份工作,在大多数情况下都很好。下载和处理数据是一个多步骤的工作。 问题是有时工作会爆棚。也许我们试图连接到的服务器抛出了错误,或者我们在工作进行到一半时关闭了服务器。此时,下次我们的quartz调度程序尝试运行该作业时,它似乎什么也不做。以下是此作业定义的删节版本: 委婉地说,我是Spring Batch

  • 我可以在xml配置中使用而没有任何问题,但如果将其用作如下注释。它会抛出以下错误 原因:组织。springframework。豆。工厂UnsatisfiedDependencyException:创建在类路径资源[BatchConfiguration.class]中定义的名为“step1”的bean时出错:通过索引1为[org.springframework.batch.item.ItemRead

  • 我试图从步骤(实现接口Tasklet的类的execute方法)内部启动作业。 显然我收到了例外 Java语言lang.IllegalStateException:在JobRepository中检测到现有事务 如何使Spring批处理步骤不是事务性的? 有人能解决我从一步内启动工作的主要需求吗? 提前感谢您的帮助!

  • 使用Spring Batch 3.0.4.Release。 我将作业配置为使用分区步骤。从机步骤使用块大小1。任务执行器中有六个线程。我使用从六到数百的各种网格大小来运行这个测试。我的网格大小是从StepExecutions的数量,我希望==我的分区器创建的ExecutionContexts的数量。 下面是Java配置代码:

  • 嗨,我有下面的xml,用于执行作业 为此,我编写了一个tasklet来执行脚本。现在我希望,如果脚本执行失败三次,那么下一步将不会执行。但是从Tasklet中,我只能返回将流程转移到下一个步骤的完成和继续过程的可持续。我在这该怎么办。