gpt4 book ai didi

java - Spring Batch 查找开始作业执行

转载 作者:行者123 更新时间:2023-12-02 09:42:08 26 4
gpt4 key购买 nike

我有一个包含一项作业的 Spring Batch 应用程序。作业执行顺序对我来说至关重要,因此JobLauncher配置为单线程作业池。换句话说,如果触发了很少的执行,则一个执行将正在运行,而其他执行将在队列中等待。

作业执行表将如下所示:

        ╒═════╤═════════════════════╤════════════╤════════════╤═════╕
│ ... │ START_TIME │ END_TIME │ STATUS │ ... │
╞═════╪═════════════════════╪════════════╪════════════╪═════╡
│ ... │ 2019-07-11 11:03:08 │ NULL │ STARTED │ ... │
├─────┼─────────────────────┼────────────┼────────────┼─────┤
│ ... │ NULL │ NULL │ STARTING │ ... │
└─────┴─────────────────────┴────────────┴────────────┴─────┘

如果 JVM 崩溃,我需要从该状态恢复并进行一些审核,因此我需要找到所有 STARTEDSTARTING处决。

找到第一个不是问题,我可以用 JobExplorer 来完成:

Set<JobExecution> executions = jobExplorer.findRunningJobExecutions("jobName");

它只会给我 STARTED执行与礼物 START_TIME 。但如何找到所有STARTING处决?

到目前为止我发现的唯一方法是迭代作业实例,然后找到 STARTING每个实例的执行。像这样的事情:

        jobExplorer.findJobInstancesByJobName("jobName", 0, 100)
.forEach(jobInstance -> {
jobExplorer.getJobExecutions(jobInstance)
.stream()
.filter(execution -> STARTING.equals(execution.getStatus()))
.forEach(execution -> {
// do the job
});
});

这里的问题是你总是在有限制的情况下进行完整扫描(我指定为 100)。有没有更好的方法,比如jobExplorer.findStartingJobExecutions("jobName")在 Spring 批处理?

最佳答案

我没有看到任何公共(public) API 可以按状态获取作业执行。你可以做的是(伪代码):

JobInstance jobInstance = jobInstanceDao.getJobInstance(jobName, jobParameters);
List<JobExecution> jobExecutions = jobExplorer.findJobExecutions(jobInstance);
// iterate over job execution and filter by status

这将避免加载所有作业实例(一次一百个)。

也就是说,我认为 JobRepository 接口(interface)可以添加一个方法来通过名称和参数获取作业实例(类似于 isJobInstanceExists)以避免使用 jobInstanceDao 如我之前的代码片段所示。

编辑:

我猜您最初的要求是将作业执行标记为无法重新启动它。为此,您可以手动将作业执行(及其步骤执行)的状态更改为 FAILED 并将其 END_TIME 设置为非空值(这在此处进行了解释) : https://docs.spring.io/spring-batch/4.1.x/reference/html/job.html#aborting-a-job )。这样,您将能够重新启动失败的执行。

关于java - Spring Batch 查找开始作业执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56986334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com