重新启动spring批处理作业

blmhpbnm  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(416)

我有一个spring批处理作业,它读取csv文件并写入数据库。我想让它重新启动。例如,如果在读取文件或写入db时出现异常,导致作业失败,那么它应该从失败的同一点/块重新开始,而不是从头开始读取整个文件。
我正在从端点触发作业启动程序,并已在控制器中配置它。
目前我正在传递一个参数 jobId (这是一个唯一的标识符/编号)通过控制器发送到作业参数以运行新的作业示例。如果作业失败,我将使用相同的 jobId 作为get请求中的params,并从上次失败的jobid处按预期重新启动作业。这种方法的问题是我必须手动维护一个单独的jobid参数列表。即使我必须运行一个新的作业示例,我也不想提供自己的jobid参数。而且,如果我不传递任何值,这种方法就会失败 jobId 参数,因此也将无法重新启动该作业示例。
我希望有没有一种方法可以在没有任何参数的情况下为每个新作业示例触发端点,如果作业失败,我希望使用 JOB_EXECUTION_ID 或者 JOB_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();

    }
}
bnlyeluc

bnlyeluc1#

我不得不一次又一次地读取同一个文件,因为其中的数据发生了变化
批处理是关于固定数据集的。内容不断变化的单个文件不是固定的数据集。流解决方案可能更适合您的用例。spring批处理作业示例应该表示一个固定的数据集(通过标识作业参数来标识)。这对于可重启性至关重要。

相关问题