繁体   English   中英

重新启动春季批处理作业

[英]Restart a spring batch job

我有一个 spring 批处理作业,它从一个 CSV 文件中读取并写入数据库。 我想让它重新启动。 例如,如果在读取文件或写入数据库时​​出现一些异常导致作业失败,它应该从失败的同一点/块重新开始,而不是从头开始读取整个文件。

我正在从端点触发作业启动器并在我的控制器中配置它。

目前,我正在通过控制器将参数jobId (这是一个唯一标识符/编号)传递给作业参数以运行新的作业实例。 如果作业失败,我会使用与 GET 请求中的 params 相同的jobId再次触发它,并按照预期从该 jobId 上次失败的位置重新启动作业。 这种方法的问题是我必须手动维护一个单独的 jobId 参数列表。 即使我必须运行新的作业实例,我也不想提供我自己的 jobId 参数。 此外,如果我没有在 GET 请求中为jobId参数传递任何值,则此方法将失败,因此也无法重新启动该作业实例。

我期待是否有一种方法可以在没有任何我自己的参数的情况下为每个新的作业实例触发端点,并且如果作业失败,我想通过使用JOB_EXECUTION_IDJOB_INSTANCE_ID来重新启动它来自 spring 批处理元数据表。

控制器:

@Autowired
JobLauncher jobLauncher;

@Autowired
Job demoJob;

@GetMapping("/demo")
public BatchStatus runDemoJob(@RequestParam(name = "jobId", required = false) String jobId) 
throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException 
{
        JobParameters p = new JobParameters();

        if (!jobId.isEmpty()) {
            p = new JobParametersBuilder().addString("jobId", jobId).toJobParameters();
        }

        JobExecution j = jobLauncher.run(demoJob, p);

        return j.getStatus();

    }
}

我必须一次又一次地读取同一个文件,因为其中的数据发生了变化

批处理是关于固定数据集的。 具有变化内容的单个文件不是固定数据集。 流式解决方案可能更适合您的用例。 spring 批处理作业实例应该代表一个固定的数据集(通过识别作业参数来识别)。 这对于可重启性至关重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM