【问题标题】:Spring Batch (java-config) executing step after a jobExeuctionDeciderSpring Batch (java-config) 在 jobExecutionDecider 之后执行步骤
【发布时间】:2014-12-31 19:19:19
【问题描述】:

我正在尝试使用 java-config 在 Spring Batch 中配置 Flow, 这个流程基本上必须这样做:

  1. 执行一个初始化步骤(在数据库中添加一条记录),

  2. 然后执行一个判定器来检查文件是否存在,

2.1。如果文件存在,它将执行加载作业(这是另一个流程,有一堆并行的步骤)

  1. 执行一个完成步骤(在数据库中添加一条记录),这应该始终运行,即使没有执行 2.1。

我尝试进行此配置,但完成步骤从未运行:

        Flow flow = new FlowBuilder<SimpleFlow>("commonFlow")
            .start(stepBuilderFactory.get("initStep").tasklet(initTasklet).build())
            .next(decider)
                .on(FlowExecutionStatus.COMPLETED.getName())
                    .to(splitFlow)
                .from(decider).on("*")
                    .end()
    .next(stepBuilderFactory.get("finishStep").tasklet(finishTasklet).build())
            .end();

我可以让它工作如下,但它一点也不优雅:

    Step finishStep = stepBuilderFactory.get("finishStep").tasklet(finishTasklet).build();

    Flow flow = new FlowBuilder<SimpleFlow>("commonFlow")
            .start(stepBuilderFactory.get("initStep").tasklet(initTasklet).build())
            .next(decider)
                .on(FlowExecutionStatus.COMPLETED.getName())
                    .to(splitFlow)
                    .next(finishStep)
                .from(decider).on("*")
                    .to(finishStep)
            .end();

有谁知道在使用 java-config 做出决定后执行步骤的正确方法是什么?

【问题讨论】:

  • 在您的第一个示例代码中,您包含了两个“end()”。尝试删除第一个“end()”。
  • .on 的返回是一个TransitionBuilder,我必须在on 之后有一些东西。我还尝试在 on 之后设置一个 Dumb 步骤,但没有成功。

标签: java spring spring-batch spring-java-config


【解决方案1】:

听起来这比它需要的复杂得多。您不需要配置流程或决策者。这是一个非常简单的工作。

最简单的选择是使用 Spring Integration 来检测文件的存在并触发作业。

下一个最简单的选项是让石英或 CRON 作业检查文件并启动批处理作业。

最后但并非最不重要的一点是,您可以让作业运行,如果 ItemReader 找不到文件,只需吞下异常。或者设置一个 FileItemReader Listener 来检查它的 before 方法中的文件。

【讨论】:

  • 这只是整个流程的一部分。如您所见,无论文件是否存在,都应该执行finishFlow。您提供的选项只会在创建文件时触发。问题是关于配置本身。
  • 好吧,如果文件是否存在并不重要,为什么要使用决策者。只需运行该作业。它检查文件运行的步骤,包括最后一个。
【解决方案2】:

您可以使用两个单独的流程来实现这一点。

Flow flowWithDecider = new FlowBuilder<SimpleFlow>("flow-with-decider")
  .start(decider)
    .on("ok")
    .to(okStep1)
    .next(okStep2)
  .from(decider)
    .on("failed")
    .to(failedStep)
  .build()

Flow commonFlow = new FlowBuilder<SimpleFlow>("common-flow")
  .start(commonStep)
  .build()


Job job = jobs
  .get("my-job")
  .start(flowWithDecider())
  .next(commonFlow()) // this will execute after the previous flow, regardless of the decision
  .end()
  .build();

【讨论】:

    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多