Springバッチ:ジョブインスタンスはすでに存在し、パラメータ= \ {}に対して完了しています.

Spring Batch:ジョブインスタンスは既に存在し、parameters = \ {}で完了しています

Spring Batch 2.2.0.RELEASEを使用し、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

  

  
    
  

問題

バッチジョブは、初回(10秒後)の2回目の起動時にのみ正常に実行され、次のエラーメッセージが表示されます。

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)

溶液

上記の「If you want to run this job again, change the parameters.」のエラーメッセージを参照してください。式はJobInstance = JobParameters + Jobです。 JobParametersのパラメーターがない場合は、パラメーターとして現在の時刻を渡すだけで、新しいJobInstanceを作成できます。 例えば、

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();
      }

    }

}