使用JobExecutionListener不断重新创建作业

时间:2014-04-24 07:40:35

标签: spring-batch

我们需要一个连续运行的工作,而无需外部调度程序。 我扩展了 JobExecutionListener ,如下所示:

@Autowired
@Qualifier("myJob")
private Job job;

private int counter = 0;

@Override
public void afterJob(JobExecution jobExecution) {

   jobExecution.stop();

   JobParameters jobParameters = new JobParameters();
   JobParameter jobParameter = new JobParameter((new Integer(++counter)).toString());
   jobParameters.getParameters().put("counter", jobParameter);
   try {
      jobLauncher.run(job, jobParameters);
   } 
   catch (JobExecutionAlreadyRunningException e) {
      throw new RuntimeException(e);
   } catch (JobRestartException e) {
      throw new RuntimeException(e);
   } catch (JobInstanceAlreadyCompleteException e) {
      throw new RuntimeException(e);
   } catch (JobParametersInvalidException e) {
      throw new RuntimeException(e);
}

运行时,抛出JobExecutionAlreadyRunningException。

JobExecutionAlreadyRunningException: A job execution for this job is already running: JobInstance: id=0, version=0, Job=[myJob]

我哪里错了?

由于

1 个答案:

答案 0 :(得分:0)

来自官方文件:

  

关闭不是立竿见影的,因为没有办法强迫   立即关闭,尤其是当前执行时   框架无法控制的开发人员代码,例如   商业服务。但是,只要控制权返回到   在框架中,它会将当前StepExecution的状态设置为   BatchStatus.STOPPED,保存它,然后对JobExecution执行相同的操作   在完成之前。

也许您可以使用专门的JobLauncher在上一个作业的线程终止或与JobLauncher关联的自定义TaskExecutor之后启动作业。