java - 重新启动春季批处理作业
问题描述
我有一个春季批处理作业,它从 CSV 文件中读取并写入数据库。我想让它重新启动。例如,如果在读取文件或写入数据库时出现异常导致作业失败,它应该从失败的相同点/块重新开始,而不仅仅是从头开始读取整个文件。
我正在从端点触发作业启动器,并已在我的控制器中对其进行了配置。
目前,我正在通过jobId
控制器将参数(这是一个唯一标识符/编号)传递给作业参数以运行新的作业实例。如果作业失败,我会使用与jobId
GET 请求中的参数相同的方法再次触发它,然后它会按预期从该 jobId 上次失败的位置重新启动作业。这种方法的问题是我必须手动维护一个单独的 jobId 参数列表。即使必须运行新的作业实例,我也不想提供自己的 jobId 参数。此外,如果我没有jobId
在 GET 请求中为 param 传递任何值,这种方法也会失败,因此也无法重新启动该作业实例。
我期待是否有一种方法可以在没有我自己的任何参数的情况下为每个新的作业实例触发端点,并且如果作业失败,我想通过使用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();
}
}
解决方案
我必须一次又一次地读取同一个文件,因为其中的数据会发生变化
批处理是关于固定数据集的。内容不断变化的单个文件不是固定的数据集。流式解决方案可能更适合您的用例。一个 spring 批处理作业实例应该代表一个固定的数据集(通过识别作业参数来识别)。这对于可重新启动性至关重要。
推荐阅读
- docker - nginx 服务页面代码而不是页面内容
- c++ - curl_easy_init 失败时如何获取错误原因
- powershell - 使用路径中的空格运行任何可能的 Powershell 脚本
- java - CanGoback() 和 goback() 在 WebView 中给出错误
- gradle - 验证工件是否成功发布到 nexus
- corda - 导入示例 Corda 项目时出现 Gradle 错误
- constraints - 在线性规划中表达 OR 约束
- r - 如何将多列合并为一列并在 R 中附加它们的唯一代码?
- jmeter - 文件上传到 API 不适用于 JMeter 中的并发用户
- python - TensorFlow tf.trainable_variables(scope="") 函数