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.
@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?
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.
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.
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);
}
}
Podobne pytania
Nowe pytania
mysql
MySQL to darmowy system zarządzania relacyjnymi bazami danych (RDBMS) o otwartym kodzie źródłowym, który wykorzystuje język SQL (Structured Query Language). NIE UŻYWAJ tego znacznika dla innych baz danych, takich jak SQL Server, SQLite itp. Są to różne bazy danych, które używają własnych dialektów SQL do zarządzania danymi.
JobInstanceAlreadyCompleteException
). Ale w twoim przypadku ustawiaszRunIdIncrementer
, więc za każdym razem powinieneś otrzymać nową instancję pracy. Jak rozpoczynasz swoją pracę?