Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring批处理(java配置)在JobExecutionDecider之后执行步骤_Java_Spring_Spring Batch_Spring Java Config - Fatal编程技术网

Spring批处理(java配置)在JobExecutionDecider之后执行步骤

Spring批处理(java配置)在JobExecutionDecider之后执行步骤,java,spring,spring-batch,spring-java-config,Java,Spring,Spring Batch,Spring Java Config,我正在尝试使用java配置在spring批处理中配置一个流, 该流程基本上必须做到这一点: 执行初始化步骤(在数据库中添加记录) 然后执行一个决策器来检查文件是否存在 2.1。如果文件存在,它将执行加载作业(这是另一个并行执行一系列步骤的流) 执行finish步骤(在数据库中添加记录),即使未执行2.1,也应始终运行该步骤 我尝试进行此配置,但“完成”步骤从未运行: Flow flow = new FlowBuilder<SimpleFlow>("commonFlow

我正在尝试使用java配置在spring批处理中配置一个流, 该流程基本上必须做到这一点:

  • 执行初始化步骤(在数据库中添加记录)

  • 然后执行一个决策器来检查文件是否存在

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

  • 执行finish步骤(在数据库中添加记录),即使未执行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();
    
    Flow-Flow=新的FlowBuilder(“commonFlow”)
    .start(stepBuilderFactory.get(“initStep”).tasklet(initTasklet.build())
    .下一个(决策者)
    .on(FlowExecutionStatus.COMPLETED.getName())
    .至(分流)
    .从(决策者).开始(“*”)
    (完)
    .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();
    
    Step finishStep=stepBuilderFactory.get(“finishStep”).tasklet(finishTasklet.build();
    流量=新的流量生成器(“commonFlow”)
    .start(stepBuilderFactory.get(“initStep”).tasklet(initTasklet.build())
    .下一个(决策者)
    .on(FlowExecutionStatus.COMPLETED.getName())
    .至(分流)
    .下一步(完成步骤)
    .从(决策者).开始(“*”)
    .至(完成步骤)
    .end();
    

    有人知道如何使用java配置在做出决定后正确地执行步骤吗?

    听起来这比需要的复杂得多。您不需要配置流或决策器。这是一项非常简单的进进出出工作

    最简单的选择是使用Spring集成来检测文件的显示并触发作业

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


    最后但并非最不重要的一点是,您可以运行作业,如果ItemReader找不到文件,只需接受异常。或者将FileItemReader侦听器设置为在其before方法上检查文件。

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

    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();
    
    Flow-flowWithDecider=新的FlowBuilder(“Flow-withdecider”)
    .开始(决策者)
    .on(“ok”)
    .to(确定步骤1)
    .下一步(确定步骤2)
    .来自(决策者)
    .on(“失败”)
    .to(失败步骤)
    .build()
    Flow commonFlow=新的FlowBuilder(“通用流”)
    .start(commonStep)
    .build()
    工作=工作
    .get(“我的工作”)
    .start(flowWithDecider())
    .next(commonFlow())//这将在上一个流之后执行,而不管决定如何
    (完)
    .build();
    
    在第一个示例代码中,包含了两个“end()”。尝试删除第一个“end()”。返回的.on是一个TransitionBuilder,我必须在on之后有一些内容。我也试着在启动后迈出一小步,但没有成功。这只是整个流程的一部分。如您所见,无论文件是否存在,都应执行finishFlow。您提供的选项仅在创建文件时触发。问题在于配置本身。如果文件是否存在并不重要,那么为什么要使用决策器呢。那就开始工作吧。它检查文件并运行步骤,包括最后一个步骤。