0

我在终止当前正在运行的春季批次时遇到问题。我写

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。

提前致谢

4

1 回答 1

0

所以,我的问题是为什么 jobExecution 在调用停止方法时有时会停止(这就是我想要的),以及为什么它不能在剩余的时间内停止 jobExecution。

从你分享的内容中很难找出原因,但我可以给你一些关于停止工作的注意事项:

  • jobOperator.stop不保证作业停止,它只向作业执行发送停止信号。从您共享的内容来看,您没有检查返回的布尔值,该布尔值指示信号是否已正确发送,因此您应该首先执行此操作。
  • 您没有共享您的代码,但您需要使用StoppableTasklet而不是Tasklet确保停止信号正确发送到您的步骤。
于 2020-10-01T09:58:26.140 回答