【问题标题】:Why is my Spring Batch job not exiting after completion为什么我的 Spring Batch 作业在完成后没有退出
【发布时间】:2020-05-05 22:13:12
【问题描述】:

我的批处理作业配置如下

@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 上本地运行它时,我必须手动退出该工作。

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

【问题讨论】:

    标签: spring-batch spring-batch-tasklet


    【解决方案1】:

    一个明显的问题是第一个 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: how do I return a custom Job exit STATUS from a StepListener to decide next step

    【讨论】:

    • 嘿——我又回到这个问题上(取消 System.exit 语句来终止工作)。我注意到 COMPLETE 状态工作正常,即如果 tasklet 返回 COMPLETE,则作业结束。当它返回一个 CONTINUE 时,作业即使在完成后也会挂起
    • 我认为当 Step0 返回 CONTINUE 时,作业不认为该步骤已完成?
    • 无论步骤是否完成,如果配置显示 .on(CONTINUE).to(Step1),那么只要 Step0 处于 CONTINUE 状态,就应该启动 Step1。
    • 是的,这个逻辑确实被执行了。如果 Step0 返回 COMPLETE,则作业成功结束。但是,如果 Step0 返回 CONTINUE,则作业会执行所有正确的后续步骤,但会在完成后挂起。
    • 我认为流程无法在 CONTINUE 分支中终止
    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多