Spring Batch 2.2.0.RELEASEで作業し、Spring Schedulerでジョブを起動します。
CustomJobLauncher.java
package com.mkyong.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
<bean id="customJobLauncher" class="com.mkyong.batch.CustomJobLauncher"/> <task:scheduled-tasks> <task:scheduled ref="customJobLauncher" method="run" fixed-delay="10000"/> </task:scheduled-tasks>
問題
バッチジョブは、最初の時間にのみ正常に実行されています.2回目(10秒後)に起動すると、エラーメッセージが表示されます。
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)
解決策
上記のエラーメッセージを参照してください。
このジョブを再度実行する場合は、パラメータを変更してください。
“数式は` 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(); }
}
}
=== 参考文献 . http://static.springsource.org/spring-batch/reference/html/configureJob.html[Spring バッチ:ジョブの設定と実行]。 http://forum.springsource.org/showthread.php?58319-How-to-create-new-job-instance-How 新しいジョブインスタンスを作成する] link://tag/spring-batch/[スプリングバッチ]