我在终止当前正在运行的春季批次时遇到问题。我写
Set<Long> executions = jobOperator.getRunningExecutions("Job-Builder");
jobOperator.stop(longExecutions.iterator().next());`
在我浏览完 spring 文档后在我的代码中。
我面临的问题是有时工作的终止按预期发生,而其他时候工作的终止没有发生。事实上,每次我在 joboperator 上调用 stop 时,它都会更新 BATCH_JOB_EXECUTION 表。当终止成功发生时,通过在我的批处理过程中终止 jobExecution,作业的状态将更新为STOPPED。其他时候,当它失败时,它正在完成批处理的其余不同流程,并将BATCH_JOB_EXECUTION 表上的状态更新为FAILED 。
但是每次我在作业操作员中调用停止时,我都会在控制台中看到一条消息
2020-09-30 18:14:29.780 [http-nio-8081-exec-5] INFO o.s.b.c.l.s.SimpleJobOperator:428 - Aborting job execution: JobExecution: id=33058, version=2, startTime=2020-09-30 18:14:25.79, endTime=null, lastUpdated=2020-09-30 18:14:28.9, status=STOPPING, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=32922, version=0, Job=[Job-Builder]], jobParameters=[{date=1601504064263, time=1601504064262, extractType=false, JobId=1601504064262}]
我的项目中有一系列流程和步骤。
总的来说,我的批处理过程如下所示:
JobBuilderFactory 有 3 个流程
每个流程有一个 stepbuilder 和两个 tasklet。
每个 stepbuilder 都有一个分区器和一个基于块(大小为 100)的 itemReader、itemProcessor 和 itemWriter。
当我在 jobBuilderFactory 中执行第一个流程时,我正在调用 stop 方法。完成整个过程大约需要 30 分钟。因此,从我调用 stop 方法开始大约需要 20-25 分钟,并且每个流中的块大小为 100,并且我正在处理超过 500k 条记录。
所以,我的问题是为什么 jobExecution 在调用停止方法时有时会停止(这就是我想要的),以及为什么它不能在剩余的时间内停止 jobExecution。
提前致谢