我创建了一个停止作业,找到具有指定名称的正在运行的作业:
jobExplorer.findRunningJobExecutions("job_A")
然后,对于job_A的每次执行,它调用:
jobOperator.stop(execution.getId());
当我调用上述stop()
方法时;即使它最终完成了我想要的东西,但它仍然会抛出异常:
WARN o.s.b.c.l.s.SimpleJobOperator [main] Cannot find Job object
org.springframework.batch.core.launch.NoSuchJobException: No job configuration with the name [job_A] was registered
at org.springframework.batch.core.configuration.support.MapJobRegistry.getJob(MapJobRegistry.java:66) ~[spring-batch-core-3.0.6.RELEASE.jar:3.0.6.RELEASE]
at org.springframework.batch.core.launch.support.SimpleJobOperator.stop(SimpleJobOperator.java:403) [spring-batch-core-3.0.6.RELEASE.jar:3.0.6.RELEASE]
当stop()
方法尝试在JobRegistry
中找到job_A时会发生这种情况。
所以尽管在" JobRepository
"中找到了job_A。因为存储库在数据库中查找,所以在" JobRegistry
"中找不到它。这是在其运行时环境中创建的作业bean的本地缓存,因为job_A正在运行,但是没有注册并抛出错误的运行时实例。
即使工作' A'停止我仍然担心因为例外我错过了什么。
我已经搜索了这个问题,并且只找到了关于如何停止作业的一般答案,但是我没有找到任何人解释如何停止另一个运行时的运行作业。
任何答案都将不胜感激。
答案 0 :(得分:0)
JobOperator
并非旨在协调您尝试执行的分布式批处理环境。你真的有两个选择:
JobRepository
- 导致作业在远程JVM中成功停止的部分是JobRepository
已更新且其他JVM中正在运行的作业知道要定期检查。不要使用JobOperator
来完成此操作,只需直接使用JobRepository
进行更新。您可以在网站上阅读有关Spring Cloud数据流的更多信息:https://cloud.spring.io/spring-cloud-dataflow/
答案 1 :(得分:0)
除了迈克尔提到的,您可以通过向应用程序添加一些界面来解决此问题,从而允许您传递命令以启动或停止您的工作。像网络服务的东西。暴露一个终点来阻止它。现在这种情况下的问题是在集群系统中处理可能有点棘手。