在jobExeuctionDecider之后执行Spring Batch(java-config)步骤

时间:2014-12-31 19:19:19

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

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

  1. 执行init步骤(在数据库中添加记录),

  2. 然后执行决策程序以检查文件是否存在,

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

    1. 执行完成步骤(在数据库中添加记录),即使未执行2.1,也应始终运行。
    2. 我尝试进行此配置,但完成步骤永远不会运行:

              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做出决定后执行步骤的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

听起来这比实际需要的要复杂得多。您无需配置流程或决策程序。这是一个非常简单的进出工作。

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

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

最后但并非最不重要的是,您可以让作业运行,如果ItemReader无法找到文件,则只需吞下例外。或者设置一个FileItemReader Listener来检查方法之前的文件。

答案 1 :(得分:0)

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

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();