Spring Batch: Eine Jobinstanz ist bereits vorhanden und für die Parameter = \ {} abgeschlossen.

Frühlingsstapel: Eine Jobinstanz ist bereits vorhanden und für parameters = \ {} vollständig.

Arbeiten mit Spring Batch 2.2.0.RELEASE und Starten des Jobs mit Spring Scheduler.

CustomJobLauncher.java

package com.example.batch;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class CustomJobLauncher {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    public void run() {

      try {

        JobExecution execution = jobLauncher.run(job, new JobParameters());
        System.out.println("Exit Status : " + execution.getStatus());

      } catch (Exception e) {
        e.printStackTrace();
      }

    }

}

job-config.xml

  

  
    
  

Problem

Der Stapeljob wird nur beim ersten Mal erfolgreich ausgeführt. Beim zweiten Start (nach 10 Sekunden) werden die folgenden Fehlermeldungen angezeigt.

org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException:
    A job instance already exists and is complete for parameters={}.
        If you want to run this job again, change the parameters.
    at org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:126)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

Lösung

Siehe Fehlermeldung über "If you want to run this job again, change the parameters.". Die Formel lautetJobInstance = JobParameters + Job. Wenn Sie keine Parameter fürJobParameters haben, übergeben Sie einfach eine aktuelle Zeit als Parameter, um ein neuesJobInstance zu erstellen. Zum Beispiel,

CustomJobLauncher.java

//...

@Component
public class CustomJobLauncher {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    public void run() {

      try {
        JobParameters jobParameters =
          new JobParametersBuilder()
          .addLong("time",System.currentTimeMillis()).toJobParameters();

        JobExecution execution = jobLauncher.run(job, jobParameters);
        System.out.println("Exit Status : " + execution.getStatus());

      } catch (Exception e) {
        e.printStackTrace();
      }

    }

}