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

Rerunning a completed Job from Spring Framework?

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

有人对如何在 Spring 框架中重新启动标记为已完成的作业有任何代码片段或替代想法吗?

任何帮助将不胜感激,谢谢!!

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

在 Batch 术语中,您实际上无法重新启动已完成的实例或执行。单个作业实例由作业参数标识。如果您需要使用相同的参数再次 运行 作业,一种方法是包含一些独特的参数,例如启动前 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