Mam zadanie Spring Batch uruchomione na naszej platformie w chmurze, które zostanie uruchomione z podanymi parametrami wiersza poleceń, a następnie pominie wykonanie pierwszego kroku z następującym błędem:

[OUT] The job execution id 992 was run within the task execution 1325
[OUT] Step already complete or not restartable, so no action to execute: 
StepExecution: id=1071, version=3, name=OFileStep, status=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, 
writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0, exitDescription= 

Zbadałem tabele metadanych w instancji MySQL, której używa Spring Batch, aby stwierdzić, że JOB_INSTANCE_ID jest taki sam między wieloma wykonaniami, kiedy powinien być zwiększany o 1 za każdym razem.

enter image description here

@Bean, który zdefiniowałem dla konfiguracji zadania, to:

@Bean
public Job job() {
    return jobBuilderFactory.get(OTaskConstants.JOB_NAME)
            .listener(listener())
            .incrementer(new RunIdIncrementer())
            .start(dataTransferTaskStep())
            .next(controlMTaskStep())
            .build();
}

Czy ktoś jest świadomy tego, co może powodować takie zachowanie?

1
Dtown 20 grudzień 2019, 02:04
Możliwe jest wykonanie wielu zadań dla tego samego wystąpienia zadania, na przykład gdy pierwsze wykonanie nie powiedzie się i spróbujesz ponownie uruchomić zadanie. Jeśli uruchomisz zadanie z tymi samymi parametrami identyfikującymi, spróbujesz (ponownie) uruchomić tę samą instancję zadania: jeśli ostatnie wykonanie zadania nie powiodło się, otrzymasz nowe wykonanie zadania, w przeciwnym razie Spring Batch poinformuje Cię, że instancja zadania jest zakończona i nie można go ponownie uruchomić (JobInstanceAlreadyCompleteException). Ale w twoim przypadku ustawiasz RunIdIncrementer, więc za każdym razem powinieneś otrzymać nową instancję pracy. Jak rozpoczynasz swoją pracę?
 – 
Mahmoud Ben Hassine
20 grudzień 2019, 12:28

3 odpowiedzi

Poniżej linia wyraźnie mówi wszystko.

Step already complete or not restartable, so no action to execute: 

Oznacza to, że krok / zadanie jest już zakończone i nie można go ponownie uruchomić. Tak zachowuje się Spring Batch. Aby to ominąć, musimy przekazać unikalny argument.

W twoim przypadku widzę, że masz już RunIdIncrementer. Teraz pytanie, dlaczego to nie działa.

Czy widzisz tabelę BATCH_JOB_PARMS, aby zobaczyć, jakie argumenty są przekazywane do zadania? Być może czegoś brakuje.

Możesz także użyć SimpleIncrementor. Zobacz poniższy kod, aby uzyskać wyjaśnienie.

https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html#JobParametersIncrementer

0
Sushil Behera 20 grudzień 2019, 03:31

Usuń adnotację @Bean w zadaniu.

Powoduje to, że zadanie jest uruchamiane bez parametrów za każdym razem, gdy uruchamiasz / uruchamiasz aplikację, gdy wiosna próbuje załadować ziarno, a następnie uruchamia zadanie wsadowe.

Usuń adnotację i użyj harmonogramu wiosennego, aby zaplanować zadania.

0
Praveen 22 grudzień 2019, 17:44

Miałem ten sam problem. Poniższy kod pomógł mi go rozwiązać. Dodając parametry w programie uruchamiającym zadania, dla każdego uruchomienia tworzony jest nowy job_instance_id.

@SpringBootApplication
public class App implements CommandLineRunner {
    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        JobParameters params = new JobParametersBuilder()
                .addString("JobID", String.valueOf(System.currentTimeMillis()))
                .toJobParameters();
        jobLauncher.run(job, params);
    }
}
0
Alex 31 maj 2021, 17:08