从Spring Framework重新运行已完成的作业?

时间:2016-07-06 14:26:49

标签: spring restlet

我正在使用Spring Framework开发一个Web应用程序,它在应用程序启动时执行一些工作,这些工作主要包括从CSV加载数据并从中生成Java对象。 目前,我正在尝试使用Restlet和Spring框架构建RESTful API,并且其中一个查询应该将作业名称作为参数并重新启动该作业,即使该作业已标记为已完成,如何完成作业重新开始?我试过弹簧框架' Joboperator接口的startNextInstance()方法还尝试手动增加JobParameters,以便没有jobinstancealrradyrunning异常?

任何人都有关于如何在Spring Framework中重新启动已标记为已完成的作业的代码段或替代想法?

非常感谢任何帮助,谢谢!!

1 个答案:

答案 0 :(得分:0)

由于您使用的条款,我非常确定您使用的是Spring Batch

在批处理术语中,您无法实际重新启动COMPLETED实例或执行。单个作业实例由作业参数标识。如果需要使用相同参数再次运行作业,则一种方法是在启动之前包含一些唯一参数,例如JobParameters的当前时间戳。

所以重新启动已完成的作业将意味着使用类似参数启动作业的新实例。以下是我之前使用的稍微修改过的代码段,它使用JobLauncherJobRegistry按名称启动新作业:

@Autowired 
@Qualifier("asyncJobLauncher")
private JobLauncher asyncJobLauncher;

@Autowired
private JobRegistry jobRegistry;

... 

public JobExecution startJob(String jobName) {
    Job job;
    try {
        job = jobRegistry.getJob(jobName);
    } catch (NoSuchJobException e) {
        // handle invalid job name
    }

    JobParametersBuilder jobParams = new JobParametersBuilder();
    jobParams.addLong("currentTime", System.currentTimeMillis());
    // add other relevant parameters

    try {
        JobExecution jobExecution = asyncJobLauncher.run(job, jobParams.toJobParameters());
        return jobExecution;
    } catch (JobExecutionAlreadyRunningException e) {
        // handle instance already running with given params 
    } catch (Exception e) {
        // handle other errors
    }
}

希望它有所帮助,这里有一些关于这个主题的reading