【问题标题】:How to partition a serial steps in sequence in spring batch如何在spring批处理中按顺序划分串行步骤
【发布时间】:2018-10-11 01:11:44
【问题描述】:

我知道spring批处理框架可以分割一个主步骤,以便并行运行多个从步骤。

我的要求是按顺序(如流)对一系列步骤进行分区以操作多个表,而不是只有一个步骤。我只能想到两个替代方案。

  1. 只创建一个 tasklet 来组装所有逻辑来更新串行表。
  2. 为流程中的每个步骤创建分区步骤。

理想情况下,我希望 Spring Batch 开箱即用地支持此功能。请阐明什么是实现目标的最佳方法。

非常感谢一个例子。

更新:我做了一些谷歌搜索,发现我可以使用 FlowStep 对流程进行分区,如下所示。这是正确的做法吗?

public Step partiotionStep() {
    return stepBuilderFactory.get("partiotionStep")
            .partitioner("slaveStep", partitioner())
            .step(new FlowStep(flow()))
            .taskExecutor(taskExecutor())
            .build();

 public Flow flow() {
    return new FlowBuilder<Flow>("flow")
            .start(step1())
            .next(step2())
            .next(step3())
            .build();

【问题讨论】:

  • “按顺序对一系列步骤进行分区”是什么意思?您可以按顺序运行多个步骤,每个步骤都是一个分区步骤。这就是你想要达到的目标吗?
  • 是的,或者我可以使用 FlowStep 将多个步骤划分为一个流。请参阅更新的问题。这样做更好吗?
  • 感谢您的澄清。看我的回答。希望对您有所帮助。

标签: spring-batch partition


【解决方案1】:

您可以定义一个包含多个步骤的作业,每个步骤都是一个分区步骤:

public Job job() {
    return jobBuilderFactory("job")
            .start(step1()) // step1 is a partitioned step
            .next(step2()) // step2 is also a partitioned step
            .build();
}

您可以在我的回答中找到类似的问题和示例:Is it possible to combine partition and parallel steps in spring batch?

希望这会有所帮助。

【讨论】:

  • 感谢您的示例。您的示例有一个问题,如果 step1 和 step2 都使用相同的输入值,如何在 step1 和 step2 之间共享执行上下文?或者 step1 和 step2 必须调用相同的 partitioner() 回调来分别提供相同的输入值? @Mahmoud Ben Hassine
  • 关于分区步骤的另一个问题,假设我有3个从步骤(即slaveStep1,slaveStep2和slaveStep3)用于step1,如果slaveStep1失败并且slaveStep2/slaveStep3成功,将slaveStep1标记为失败,但step1继续执行,将触发step2。否则 step1 将失败,作业执行停止。 @Mahmoud Ben Hassine
  • 如果其中一个工作步骤失败,分区的主步骤将失败。现在由于 step1 和 step2 被定义为顺序运行,如果 step1 失败,那么作业也会失败,step2 将不会被执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2019-12-11
  • 2019-12-05
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
相关资源
最近更新 更多