当前位置: 首页 > 知识库问答 >
问题:

Spring Batch:终止当前正在运行的作业

岑驰
2023-03-14
Set<Long> executions = jobOperator.getRunningExecutions("Job-Builder");
jobOperator.stop(longExecutions.iterator().next());`

在浏览了spring文档之后,在我的代码中。

我面临的问题是,有时工作的终止是发生在预期和其他时间终止工作是不发生的。实际上,每次调用joboperator上的stop时,它都在更新BATCH_JOB_EXECUTION表。当终止成功发生时,作业的状态将通过杀死批处理过程中的jobExecution更新为STOPPED。其他失败的时候,它会完成批处理的其他不同流,并将BATCH_JOB_EXECUTION表上的状态更新为FAILD。

但是每次我在作业操作符中调用stop时,我都会在控制台中看到一条消息

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}]

共有1个答案

国言
2023-03-14

所以,我的问题是为什么jobExecution在调用stop methos时会停止(这正是我想要的),以及为什么它不能在剩下的时间内停止jobExecution。

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

  • joboperator.stop不能保证作业停止,它只向作业执行发送停止信号。从您共享的内容来看,您没有检查返回的布尔值,该值指示信号是否正确发送,因此您应该首先检查该值。
  • 您没有共享代码,但需要使用stoppabletasklet而不是tasklet来确保停止信号正确地发送到您的步骤。
 类似资料:
  • 问题内容: 我有一些任务是在Java Quartz Jobs的帮助下执行的,但是我需要在某些情况下在代码中停止某些任务。我读到这可以通过InterruptableJob完成。但是我不知道我应该怎么做? 问题答案: 您需要将您的工作写成InterruptableJob的实现。要中断此作业,您需要Scheduler的句柄,然后调用 请查看上述类的@javadoc,石英发行版也包含此示例(example

  • 问题内容: 我正在使用Python启动程序。 在某些情况下,程序可能会冻结。这是我无法控制的。我从命令行启动时唯一可以做的就是迅速杀死程序。 有什么办法可以模仿吗?我正在用来启动程序。 问题答案: 请查看该模块上的文档以了解更多信息:http : //docs.python.org/2/library/subprocess.html

  • 问题内容: 在我的应用程序中,我对一些本机代码进行了包装,这是通过JNI桥调用的。此本地代码需要在单独的线程中执行(并行处理)。但是,问题在于代码有时“挂起”,因此线程需要“强制”终止。不幸的是,我还没有找到任何“微妙的”方法来这样做:一般建议是告诉线程中的代码正常退出,但是我无法使用此本地代码(以上均为第三方代码)来执行此操作。 我使用Java Concurrent API进行任务提交: 只会中

  • 我有一个正在运行的Spark应用程序,它占据了所有核心,而我的其他应用程序将不会被分配任何资源。 我做了一些快速的研究,人们建议使用YARN kill或 /bin/spark-class来杀死命令。然而,我使用的是CDH版本, /bin/spark-class根本不存在,YARN kill应用程序也不起作用。 有人能和我一起吗?

  • 问题内容: 我有一个多线程的Java项目,我想添加一个方法stop()来停止所有正在运行的线程。问题在于该项目是由其他人开发的,而我不熟悉它如何实现多个线程。 我知道的是,一旦项目开始,就会调用许多线程,并且它们将永远运行。有没有办法找到所有正在运行的线程并停止它们?我进行了很多搜索,找到了如何获取正在运行的线程的列表: 接下来要停止所有正在运行的线程该怎么办? 我想停止这些线程的原因是,我需要将