【发布时间】:2019-11-21 00:05:11
【问题描述】:
我有一个带有一份工作的 Spring Batch 应用程序。作业执行顺序对我来说很重要,所以JobLauncher 配置为单线程作业池。换句话说,如果触发的执行很少,一个执行将运行,另一个将在队列中等待。
作业执行表如下所示:
╒═════╤═════════════════════╤════════════╤════════════╤═════╕
│ ... │ START_TIME │ END_TIME │ STATUS │ ... │
╞═════╪═════════════════════╪════════════╪════════════╪═════╡
│ ... │ 2019-07-11 11:03:08 │ NULL │ STARTED │ ... │
├─────┼─────────────────────┼────────────┼────────────┼─────┤
│ ... │ NULL │ NULL │ STARTING │ ... │
└─────┴─────────────────────┴────────────┴────────────┴─────┘
如果 JVM 崩溃,我需要从该状态中恢复并进行一些审计,因此我需要找到所有 STARTED 和 STARTING 执行。
发现第一个没问题,我可以用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)。 Spring Batch 中有没有像jobExplorer.findStartingJobExecutions("jobName") 这样更好的方法?
【问题讨论】:
标签: java spring spring-batch