1

我的批处理作业配置如下

@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 是 tasklet。我的工作正在完成消息Job: [FlowJob: [name=MyJob]] completed with the following parameters。然而,它并没有退出——它挂在那里。当我在 IntelliJ 上本地运行它时,我必须手动退出该工作。

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

4

1 回答 1

2

一个明显的问题是第一个 on() 中的单词“COMPLETE”。方法 on(String pattern) 被赋予“COMPLETE”作为参数,而不是例如“COMPLETED”,如果尚未创建适当的自定义退出状态,则作业以 FAILED 状态完成。但是,我不知道它为什么会挂起,并且在您的情况下不仅会失败。您的作业配置的以下版本似乎运行良好,只要所有小任务都返回 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 的目的。因此,使用此配置是不可能达到 Step1 的。为了决定是否应该运行后续步骤,而不是使用 tasklet 重复状态(我不知道是否可能),您可以在 Step0 上使用 StepExecutionListener 或在 Step0 之后向流程添加决策器:

Spring-Batch:如何从 StepListener 返回自定义 Job exit STATUS 以决定下一步

于 2020-01-21T22:16:29.520 回答