如何成功退出Spring Batch应用程序?

问题描述

我正在创建一个非常通用的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也更新为“ COMPLETED”状态。之后,Spring Batch应用程序将继续运行,并且不会退出。一旦完成所有工作,我不知道如何退出spring batch应用程序。

我从其他一些话题开始做下面的事情,

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

这有效,但是问题是它不等待所有作业,完成后的第一个作业,应用程序退出。我该如何等待所有作业完成然后退出。

解决方法

问题spring boot running jobs on startup feature可以解决吗?如果您的工作被声明为Spring bean,则可能是问题的原因。

,

从根本上讲,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);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...