gpt4 book ai didi

spring - 无法重新启动 Spring 批处理作业

转载 作者:行者123 更新时间:2023-12-01 13:42:33 24 4
gpt4 key购买 nike

我有一个 spring 批处理作业,它读取、转换和写入 Oracle 数据库。我正在通过 CommandLineJobRunner 实用程序运行该作业(使用一个胖 jar + 使用 maven shade 插件生成的依赖项);由于“达到 Java 堆内存限制”,该作业随后在中途失败,并且该作业未标记为 FAILED,但仍显示状态 STARTED。

我尝试使用相同的作业参数(如文档建议)重新运行作业,但这给了我这个错误:

5:24:34.147 [main] ERROR o.s.b.c.l.s.CommandLineJobRunner - Job Terminated in error: A job execution for this job is already running: JobInstance: id=1, version=0, Job=[maskTableJob]

org.springframework.batch.core.repository.JobExecutionAlreadyRunningException:此作业的作业执行已在运行:JobInstance:id=1,version=0,Job=[maskTableJob]
在 org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:120) ~[maskng-batch-1.0-SNAPSHOT-executable.jar:1.0-SNAPSH

我尝试了各种方法(例如手动将状态设置为 FAILED,使用 -restart 参数)但无济于事。有什么我在这里遗漏的,因为我认为 Spring Batch 的优点之一是它能够在他们停止的地方重新启动工作......!!?

最佳答案

您应该知道的第一件事是 Joblauncher 不能用于重新启动已经运行的作业。
您收到“JobExecutionAlreadyRunningException”的原因是因为您传递的参数已存在于数据库中,因此您收到此异常。

在 spring 批处理中,如果作业以“FAILED”状态或“STOPPED”状态完成,则可以重新启 Action 业。

作业运算符(operator) 具有 restart 方法,可用于通过传递以“FAILED”状态或“STOPPED”状态完成的作业执行 ID 来重新启动失败的作业。

请注意,如果作业以“FINISHED”状态完成,则无法重新启 Action 业。
在这种情况下,您必须使用新的作业参数提交新作业

如果您想手动将作业的状态设置为失败,请运行以下查询并使用 JobOperator.restart() 方法重新启 Action 业。

update batch_job_execution set status="FAILED", version=version+1 where job_instance_id=jobId;

事务管理处理不当可能是您的作业状态未更新为“FAILED”状态的可能原因之一。即使作业遇到运行时异常,请确保您的事务正在完成。

关于spring - 无法重新启动 Spring 批处理作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38745019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com