Spring批处理 - 停止在不同的JRE中运行作业

时间:2017-10-19 14:51:58

标签: spring spring-batch

背景:

我创建了一个停止作业,找到具有指定名称的正在运行的作业:

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'停止我仍然担心因为例外我错过了什么。

我已经搜索了这个问题,并且只找到了关于如何停止作业的一般答案,但是我没有找到任何人解释如何停止另一个运行时的运行作业。

任何答案都将不胜感激。

2 个答案:

答案 0 :(得分:0)

JobOperator并非旨在协调您尝试执行的分布式批处理环境。你真的有两个选择:

  1. 直接使用JobRepository - 导致作业在远程JVM中成功停止的部分是JobRepository已更新且其他JVM中正在运行的作业知道要定期检查。不要使用JobOperator来完成此操作,只需直接使用JobRepository进行更新。
  2. 使用更强大的编排工具,如Spring Cloud Data Flow - 这种编排(部署,启动,停止等)作业(通过Spring Cloud Task)就是Spring Cloud Data Flow为。
  3. 您可以在网站上阅读有关Spring Cloud数据流的更多信息:https://cloud.spring.io/spring-cloud-dataflow/

答案 1 :(得分:0)

除了迈克尔提到的,您可以通过向应用程序添加一些界面来解决此问题,从而允许您传递命令以启动或停止您的工作。像网络服务的东西。暴露一个终点来阻止它。现在这种情况下的问题是在集群系统中处理可能有点棘手。