【发布时间】:2016-08-03 13:27:57
【问题描述】:
我有一个春季批处理作业,它读取、转换和写入 Oracle 数据库。我正在通过 CommandLineJobRunner 实用程序运行作业(使用由 maven shade 插件生成的 fat jar + 依赖项);由于“已达到 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
我尝试了各种方法(例如使用 -restart 参数手动将状态设置为 FAILED),但均无济于事。有什么我在这里遗漏的,因为我认为春季批处理的优点之一是它能够重新开始他们停止的工作......!!?
【问题讨论】:
-
重新运行作业不会使用相同的参数。添加当前时间作为参数重新运行。见mkyong.com/spring-batch/…。另请查看文档:docs.spring.io/spring-batch/reference/html/…
-
是的,我知道,但是我需要重新运行一项特定的工作,因为我希望它能够从中断的地方继续。我的工作处理数 TB 的行,可能需要几天才能运行,所以我确实想每次都从头开始重新启动该死的东西 :-)
-
我认为步骤中的块处理应该处理这些事情
-
啊哈...我发现了问题!我已将 jobRepository 切换为使用另一个数据库,但这似乎给 Spring 造成了一些混乱,所以我放弃了所有内容并从头开始,现在可以按预期工作
-
@ChristopherRichardDobbs 阅读我的回答,如果您还需要其他内容,请告诉我。
标签: spring spring-batch