Spring batch 为什么我的Spring批处理作业在完成后不退出

Spring batch 为什么我的Spring批处理作业在完成后不退出,spring-batch,spring-batch-tasklet,Spring Batch,Spring Batch Tasklet,我的批处理作业配置如下 @Bean("MyJob") public Job umpInpatientCensusRptBatchJob(...) throws IOException { return jobBuilderFactory.get( "MyJob" ) .incrementer( new RunIdIncrementer() ) .start( Step0 ).on( COMPLETE ).en

我的批处理作业配置如下

@Bean("MyJob")
    public Job umpInpatientCensusRptBatchJob(...) throws IOException {
        return jobBuilderFactory.get( "MyJob" )
                .incrementer( new RunIdIncrementer() )
                .start( Step0 ).on( COMPLETE ).end()
                .from( Step0 ).on( CONTINUE )
                .to( Step1 )
                .next( Step2 )
                .next( Step3 )
                .end()
                .build();
    }
其中,步骤0、1和3是微线程。我的作业正在完成,消息是
Job:[FlowJob:[name=MyJob]]已完成,参数如下
。然而,它没有退出——它挂在那里。当我在IntelliJ上本地运行它时,我必须手动退出该作业


我还没有实现任何异步性。每个tasklet在完成时也会显式返回一个
已完成
状态。

一个明显的问题是first on()中的“COMPLETE”一词。 (字符串模式)上的方法作为参数指定为“COMPLETE”,而不是“COMPLETED”,例如,如果尚未创建适当的自定义退出状态,则作业将以失败状态完成。然而,我不知道为什么它会挂起,而不是在你的情况下失败。 只要所有的Tasklet返回FINISHED RepeatStatus,以下版本的作业配置似乎运行正常:

@Bean("MyJob")
public Job umpInpatientCensusRptBatchJob(...) throws IOException {
    return jobBuilderFactory.get( "MyJob" )
            .incrementer( new RunIdIncrementer() )
            .start( Step0 ).on( "COMPLETED" ).end()
            .from( Step0 ).on( "CONTINUE" )
            .to( Step1 )
            .next( Step2 )
            .next( Step3 )
            .end()
            .build();
}
如果Step0的tasklet返回RepeatStatus.CONTINUABLE,Step0将永远重复,因为这是RepeatStatus的目的。因此,使用这种配置不可能达到步骤1。 为了决定是否应该运行下一步,您可以在步骤0上使用StepExecutionListener,或者在步骤0之后向流添加决策器,而不是使用tasklet repeat状态(我不知道是否可能):


Hey-我又回到这个问题上来了(删除System.exit语句以终止作业)。我注意到COMPLETE状态工作正常,即如果tasklet返回COMPLETE,则作业结束。当它返回一个即使作业完成后仍然挂起的继续时,我想当StEP0返回继续时,作业不认为该步骤是完整的。不管步骤是否完成,如果配置表示。继续(到步骤1),则STEP1每当STEP0有继续状态时就应该开始。这一逻辑确实得到了执行。如果步骤0返回“完成”,则作业将成功结束。但是,如果Step0返回CONTINUE,作业将执行所有正确的后续步骤,但在完成后挂起。我认为流无法在CONTINUE分支中终止