【问题标题】:How to Exit Spring Batch Application Successfully?如何成功退出 Spring Batch 应用程序?
【发布时间】:2020-12-01 15:08:02
【问题描述】:

我正在创建一个非常通用的 Spring Batch 应用程序,我从 YAML 文件中读取了很多配置,并动态创建作业并注册如下所示的作业,

jobRegistry.register(new ReferenceJobFactory(job));

所有这些都在配置类中完成。之后我启动如下所有工作,

jobs.forEach(j -> {
            Job job;
            try {
                job = jobRegistry.getJob(j);
                JobExecution jobExecution = jobLauncher.run(job, jobParameters);
                jobExecutions.add(jobExecution);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

到目前为止一切都很好,所有作业都已成功执行并完成,并且 JobRepository 也更新为“已完成”状态。在此之后,Spring Batch 应用程序继续运行并且不会退出。所有作业完成后,我不知道如何退出spring批处理应用程序。

我跟随其他一些线程在下面做,

ConfigurableApplicationContext run = SpringApplication.run(ChpCgmsReplicationApplication.class, args);
        System.exit(SpringApplication.exit(run));

这可行,但问题是它不会等待所有作业,第一个作业完成后,应用程序退出。如何让这个等到所有作业完成然后退出。

【问题讨论】:

  • 你试过使用属性 spring.main.web-application-type: none 吗?
  • 是的,试过了,不行。
  • 您是否尝试过 ApplicationContext 中的 close() 方法而不是退出。 SpringApplication.run(EanApplication.class, args).close();
  • close() 方法在作业开始之前关闭上下文。这也不起作用。
  • 您是否有一个 ThreadPoolTaskExecutor bean(可能在您的作业启动器中使用)阻止您的应用退出?

标签: java spring spring-boot spring-batch


【解决方案1】:

问题是否与 spring boot running jobs on startup feature 相关?如果您的作业被声明为 spring bean,这可能是问题的原因。

【讨论】:

    【解决方案2】:

    从根本上说,Spring Batch 如何知道“所有工作都已完成”?您动态注册了这些职位,因此您可能还会注册更多职位。

    您可以等到根据您的代码完成所有必需的作业,然后关闭应用程序,例如:applicationContext.close()。您如何跟踪所有作业何时完成将取决于您的作业如何运行,但它可以像计数器或 CountDownLatch 一样简单。

    类似的东西

    int jobsCount = ...
    CountDownLatch doneSignal = new CountDownLatch(jobsCount);
    
    jobs.forEach(j -> {
                // ...
                doneSignal.countDown();
            });
    
    ConfigurableApplicationContext run = SpringApplication.run(...);
    doneSignal.await();
    SpringApplication.exit(run);
    
    

    【讨论】:

    • 这似乎是一个不错的方法。但是我想知道,当Spring的Auto Configuration在使用@Job注解注册时运行所有Job Bean时,spring是如何启动退出过程的?对此有任何想法吗? spring 是否也有类似 CountDownLatch 的方法?
    猜你喜欢
    • 1970-01-01
    • 2011-10-16
    • 2014-10-27
    • 2021-12-09
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2019-02-08
    • 2019-05-19
    相关资源
    最近更新 更多