【问题标题】:How to avoid relaunching task while it's status is still running on Spring Cloud Data Flow如何避免在其状态仍在 Spring Cloud Data Flow 上运行时重新启动任务
【发布时间】:2019-10-30 09:51:56
【问题描述】:

我已经在 Spring Cloud Data Flow 上部署了一个 Spring Batch 项目作为任务。

我是第一次启动任务(它要运行大约 5 分钟,这使得任务的状态是“正在运行”)。但是,当它的状态正在运行并且它再次工作时,我第二次重新启动了此任务。

1) 我如何配置该任务直到最后一次完成状态才能重新启动。 2)此外,我发现停止作业时,它将执行直到完成当前步骤(我的作业有2个步骤,第二个步骤没有执行)。但是,有什么方法可以在我停止作业时立即关闭它(步骤 1)?

【问题讨论】:

标签: java spring-batch spring-cloud-dataflow


【解决方案1】:

如何避免在 Spring Cloud Data Flow 上仍在运行状态时重新启动任务

Spring Cloud Task 2.0.0 添加了一个功能,可以防止任务并发运行。见https://spring.io/blog/2018/05/07/spring-cloud-task-2-0-0-release-is-now-available#restricting-concurrent-task-execution

您需要激活spring.cloud.task.singleInstanceEnabled=true 属性。

您可以在Restricting Spring Cloud Task Instances 部分找到更多详细信息。

【讨论】:

  • 谢谢@Mahmoud Ben Hassine。但是,我应该在哪里放置该属性?在 Spring Cloud DataFlow 的 application.properties 或 Spring Batch 项目的 application.properties 中
  • spring.cloud.task.singleInstanceEnabled=true 已永久锁定我的任务(第一次运行后我无法再次运行它)。如何设置该任务可以在上一次启动完成后再次启动?
  • 您的任务是春季批处理作业吗?如果是,那么它是正常的,因为如果成功完成,则无法重新执行 spring 批处理作业实例。您需要更改参数以运行新的作业实例。
【解决方案2】:

您可以使用JobExplorer 类来检查正在运行的作业,请参阅jobExplorer.findRunningJobExecutions(jobName) 方法。

在您的 JobLauncher 类中,您可以这样做:

@Component
public class MyJobLauncher {

    private static final Logger LOG = LoggerFactory.getLogger(MyJobLauncher.class);

    private final Job job;

    private final JobLauncher jobLauncher;

    private final JobExplorer jobExplorer;

    @Autowired
    public MyJobLauncher(@Qualifier("myJob") Job job, JobLauncher jobLauncher, JobExplorer jobExplorer) {
        this.job = job;
        this.jobLauncher = jobLauncher;
        this.jobExplorer = jobExplorer;
    }

    public void launchJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException,
            JobRestartException, JobInstanceAlreadyCompleteException, IOException {

        if (jobExplorer.findRunningJobExecutions("myJob").isEmpty()) {
            LOG.info("Starting myJob");
            jobLauncher.run(job, new JobParameters());
            LOG.info("Stopping myJob");
        }
    }
}

要关闭作业,请检查可以从jobExplorer.getJobExecution() 方法获取的JobExecution.stop() 方法。

【讨论】:

  • 感谢您的帮助。但是,您的解决方案可能无法满足我的问题。我会试试的
猜你喜欢
  • 1970-01-01
  • 2020-06-30
  • 2019-06-28
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多