Spring批处理(java配置)在JobExecutionDecider之后执行步骤
我正在尝试使用java配置在spring批处理中配置一个流, 该流程基本上必须做到这一点: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
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。您提供的选项仅在创建文件时触发。问题在于配置本身。如果文件是否存在并不重要,那么为什么要使用决策器呢。那就开始工作吧。它检查文件并运行步骤,包括最后一个步骤。