当前位置: 首页 > 知识库问答 >
问题:

重新启动spring批处理作业

路昆杰
2023-03-14

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

我正在从一个endpoint触发作业启动器,并在我的控制器中配置了它。

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

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

控制器:

@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();

    }
}

共有1个答案

郑俊彦
2023-03-14

我不得不一次又一次地读取相同的文件,因为其中的数据发生了变化

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

 类似资料:
  • 我需要从远程SFTP服务器下载一个文件,并使用spring batch处理它们。我已经实现了使用Spring集成下载文件的代码。但我无法从Spring集成组件启动Spring批处理作业。我有以下代码: 但这不起作用(上一个方法中的错误),因为找不到文件类型的bean。我不能把这两部分连在一起。如何连接集成和批处理?

  • 我有一个spring boot应用程序,它应该将数据库(产品)中的一个表导出为文件,所以我使用spring batch来实现这一点,我的问题是,当作业完成时,应用程序重新启动,我认为这是因为spring batch在完成后关闭了实体管理器,但我不确定 注意1:我使用作为Reader。 注意2:我正在使用从controller启动作业 注5:我发现了一个类似问题的问题,但它没有答案和关闭(重复),但

  • 是否可以配置Spring批处理管理员来启动主作业和从作业。我们有一个进程作为主节点和3-4个从节点。 Spring batch admin在单独的JVM进程中运行,但所有Spring批处理作业都使用相同的批处理数据库模式。

  • 我正在测试Spring Batch重新启动功能,其中我期望在执行之间手动终止的作业在提供JOB_EXECUTION_ID时重新启动。 我更新了BATCH_JOB_EXECUTION和BATCH_STEP_EXECUTION表,使其状态和退出代码为“失败”。但是当我试图通过提供EXECUTION_ID来重新启动作业时,我得到了如下的异常 有人能告诉我我在这里犯了什么错误吗?

  • 我遵循了spring批处理文档,无法异步运行我的作业。 因此,我从一个web容器运行该作业,该作业将通过RESTendpoint触发。 我想让JobInstance ID在完成整个作业之前传递它作为响应。因此,他们可以稍后使用JobInstance ID检查作业的状态,而不是等待。但我没能让它工作。下面是我尝试过的示例代码。请让我知道我错过了什么或错了什么。 BatchConfig创建异步JobL