Почему моя работа Spring Batch не завершается после завершения - PullRequest
0 голосов
/ 19 января 2020

Мое пакетное задание настроено следующим образом

@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]] completed with the following parameters. Тем не менее, он не выходит - он висит там. Когда я запускаю его локально на IntelliJ, мне приходится вручную завершать работу.

Я не реализовал асинхронность. Каждый тасклет также явно возвращает статус FINISHED после завершения.

1 Ответ

1 голос
/ 22 января 2020

Очевидной проблемой является слово «ЗАВЕРШЕНО» внутри первого on (). Метод on (шаблон String) получает значение «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 возвращает RepeatStatus.CONTINUABLE, Step0 повторяется навсегда, так как это цель этого RepeatStatus. Таким образом, невозможно достичь Step1 с этой конфигурацией. Чтобы решить, следует ли вам выполнять следующие шаги, вместо использования статуса повторения тасклета (что я не знаю, возможно ли это), вы можете либо использовать StepExecutionListener на Step0, либо добавить решатель в поток после Step0:

Spring-Batch: как вернуть пользовательский STATUS для выхода из задания из StepListener, чтобы решить следующий шаг

...