【问题标题】:How to stop Job in Spring Batch remote chunking, when slaves are completed?当奴隶完成时,如何在 Spring Batch 远程分块中停止作业?
【发布时间】:2019-05-29 11:32:51
【问题描述】:

我使用这个示例作为 spring 批处理应用程序的起点,使用远程分块: https://github.com/benas/spring-batch-remote-chunking-sample/blob/master/src/main/java/io/github/benas/MasterConfiguration.java 在这个例子中,我添加了我的自定义读取器/写入器,但我没有更改任何配置。该示例工作正常,除了在所有从属设备完成后我无法停止工作。

我尝试使用 JobListner 来在 'afterJob' 方法中停止作业,但没有结果。

public class MyJobExecutionListener implements JobExecutionListener {

@Override
public void beforeJob(JobExecution jobExecution) {
    // TODO Auto-generated method stub

}

@Override
public void afterJob(JobExecution jobExecution) {

    System.out.println("afterJob start~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    System.out.println(jobExecution.getExitStatus().getExitCode());
    System.out.println(jobExecution.getExitStatus().getExitDescription());
    System.out.println(jobExecution.getStartTime());
    System.out.println(jobExecution.getEndTime());
    System.out.println(jobExecution.isRunning());
    System.out.println(jobExecution.isStopping());

    jobExecution.stop();

    System.out.println("!!!!!!!!!");
    System.out.println(jobExecution.isRunning());
    System.out.println(jobExecution.isStopping());
    System.out.println(jobExecution.getEndTime());


    System.out.println("afterJob end~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}

}

jobExecution.getExitStatus().getExitCode() 已完成 jobExecution.isStopping() 为 true,但应用仍在运行。

为了运行应用程序,我使用的是 SpringBoot(而不是将其作为单元测试运行,就像在示例中一样)

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class AppStarter {

   public static void main(String[] args) {

      System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!! start");
      SpringApplication.run(AppStarter.class, args);

   }
}

有没有办法在完成后停止应用程序?

【问题讨论】:

  • 主机应该自动停止。还有其他东西阻止应用程序上下文停止(ThreadPoolTaskExecutor 或一些需要显式停止的 Spring Integration 组件)。您的应用程序中是否有其中之一?我知道您说您没有更改任何配置,但由于您使用的是 Spring Boot,它可能隐式添加了一些内容。你能分享你的回购吗?
  • 代码是本地的,在虚拟机上,所以我不能在公共仓库上发布它。在主配置类中,我有:` @Configuration @EnableBatchProcessing @EnableIntegration @PropertySource("classpath:application.properties") `
  • 我也在使用JMS进行主从通信:@Bean public IntegrationFlow outboundFlow(ActiveMQConnectionFactory jmsConnectionFactory) { return IntegrationFlows.from(masterRequests()) .handle(Jms.outboundAdapter(jmsConnectionFactory).destination("requests")) .get(); } @Bean public IntegrationFlow masterInboundFlow(ActiveMQConnectionFactory jmsConnectionFactory) { return IntegrationFlows.from(Jms.messageDrivenChannelAdapter(jmsConnectionFactory).destination("replies")) .channel(masterReplies()) .get(); }
  • 抱歉格式化,我还在习惯它

标签: java spring-batch


【解决方案1】:

您可以通过以下方式显式停止主服务器的应用程序上下文:

ConfigurableApplicationContext context = SpringApplication.run(YourMasterApp.class, args);
context.close();

这将确保主端已完成运行作业,然后关闭应用程序上下文。

不过有几点注意事项:

希望这会有所帮助。

【讨论】:

  • 另外,我收到了一些更新,我必须从控制器启动作业。对我来说更好,因为它可以使用 jobLauncher.run(job, new JobParameters()); 之类的东西开始。所以,我可以访问 JobLauncher 并且更容易控制(至少对我来说)。
  • 很高兴它有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多