首页 > 解决方案 > 重新启动春季批处理作业

问题描述

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

我正在从端点触发作业启动器,并已在我的控制器中对其进行了配置。

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

我期待是否有一种方法可以在没有我自己的任何参数的情况下为每个新的作业实例触发端点,并且如果作业失败,我想通过使用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();

    }
}

标签: javaspringspring-bootspring-batch

解决方案


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

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


推荐阅读