Crash Spring批处理重新启动崩溃的作业

Crash Spring批处理重新启动崩溃的作业,crash,spring-batch,recover,Crash,Spring Batch,Recover,嗨,spring批量用户 关于文件 如果进程死机(“kill-9”或服务器故障),作业当然不会运行,但JobRepository无法知道,因为在进程死机之前没有人告诉它 我尝试使用 Set<JobExecution> jobExecutions = jobExplorer.findRunningJobExecutions(jobName); ... jobExecution.setStatus(FAILED); jobExecution.setEndTime(new Date());

嗨,spring批量用户

关于文件

如果进程死机(“kill-9”或服务器故障),作业当然不会运行,但JobRepository无法知道,因为在进程死机之前没有人告诉它

我尝试使用

Set<JobExecution> jobExecutions = jobExplorer.findRunningJobExecutions(jobName);
...
jobExecution.setStatus(FAILED);
jobExecution.setEndTime(new Date());
jobRepository.update(jobExecution);
jobOperator.restart(jobExecution.getId());
Set jobExecutions=jobExplorer.findRunningJobExecutions(jobName);
...
jobExecution.setStatus(失败);
jobExecution.setEndTime(新日期());
jobRepository.update(作业执行);
重新启动(jobExecution.getId());
但这似乎很不方便。 1) 在其他(新)工作开始之前,我必须这样做。 2) 我必须处理多个运行服务器的实例,这样findRunningJobExecutions就不会起作用

您可以找到有关此主题的其他问题:

我希望看到一个注册“启动清洁工作侦听器”的解决方案。这仍然无法修复由多服务器环境引发的问题,因为spring batch不知道标记为STARTED的JobExecution是否在其他实例上运行

谢谢你的建议
Alex

您的工作不能也不应该从
kill-9
场景中“自动”恢复。对
kill-9
的处理与抛出捕获的
异常的应用程序非常不同。这样做的原因是,您已经有效地将地毯从应用程序下面拉了出来,而没有给它机会与数据库达到同步点,以便将任何必要的信息提交到
ExecutionContext
或更新作业/步骤状态。因此,与数据库的最后一个状态接触点将保持不变,作业看起来仍然是
已启动的

“好的,很好,”你说,“但是如果我开始另一次执行,我希望它找到
已开始执行的
执行,并从它停止的地方开始执行。”这里的问题是,应用程序没有清晰的方法来区分实际运行的作业和失败但无法启动数据库的作业。这里的框架正确地犯了一个谨慎的错误,阻止您启动一个已经运行的作业,这是一件好事

为什么??因为假设你的工作还在运行,而你又意外地重新启动了。如编码所示,框架将开始旋转,查看您正在运行的执行,并失败,出现以下消息
此作业的作业执行已在运行
。我无法告诉你有多少次我们因为有人两次不小心启动了一个作业而被拯救了

如果您要实现您建议的侦听器,那么第二次执行将被允许启动,您将有两个不同的JVM重复相同的工作,可能会写入相同的文件/表,并导致无法清理的巨大数据混乱

相信我,如果Linux终端终止了您的作业,或者您的作业因为与数据库的连接已断开而死亡,您希望在尝试重新启动之前让人看到这些执行状态

最后,如果你真的想干掉你的工作,你可以利用其他几种标准模式来停止工作:


您的作业不能也不应该从
kill-9
场景中“自动”恢复。对
kill-9
的处理与抛出捕获的
异常的应用程序非常不同。这样做的原因是,您已经有效地将地毯从应用程序下面拉了出来,而没有给它机会与数据库达到同步点,以便将任何必要的信息提交到
ExecutionContext
或更新作业/步骤状态。因此,与数据库的最后一个状态接触点将保持不变,作业看起来仍然是
已启动的

“好的,很好,”你说,“但是如果我开始另一次执行,我希望它找到
已开始执行的
执行,并从它停止的地方开始执行。”这里的问题是,应用程序没有清晰的方法来区分实际运行的作业和失败但无法启动数据库的作业。这里的框架正确地犯了一个谨慎的错误,阻止您启动一个已经运行的作业,这是一件好事

为什么??因为假设你的工作还在运行,而你又意外地重新启动了。如编码所示,框架将开始旋转,查看您正在运行的执行,并失败,出现以下消息
此作业的作业执行已在运行
。我无法告诉你有多少次我们因为有人两次不小心启动了一个作业而被拯救了

如果您要实现您建议的侦听器,那么第二次执行将被允许启动,您将有两个不同的JVM重复相同的工作,可能会写入相同的文件/表,并导致无法清理的巨大数据混乱

相信我,如果Linux终端终止了您的作业,或者您的作业因为与数据库的连接已断开而死亡,您希望在尝试重新启动之前让人看到这些执行状态

最后,如果你真的想干掉你的工作,你可以利用其他几种标准模式来停止工作:


kill-9是一种不可能真正(干净)重新启动的场景,spring batch无法保存当前流程进度以重新启动。是的,感谢您的评论。我知道它不是这样设计的,但它应该能处理这些东西。我制造了一个问题,像这样使服务器崩溃可能不是很常见,但对于生产环境来说这是可能的,应该以最干净的方式处理。kill-9是一种不可能真正(干净)重新启动的场景,spring batch无法保存当前的流程进度以重新启动,谢谢你的来信