在 Spring 个批次中查询批处理作业元数据

Query batch job metadata in Spring batch

我想从 BATCH_JOB_EXECUTION-table 中获取 10 条最新记录并加入 BATCH_JOB_INSTANCE-table。

那么我怎样才能访问这些表呢?

在此应用程序中,我使用了 Spring Data JPA。这是另一个使用 Spring Batch 并创建这些表的应用程序。换句话说,我只想 运行 一个 JOIN 查询并将其直接映射到我的自定义对象,只包含必要的字段。我想尽可能避免为两个表制作单独的模型。但我不知道这里最好的方法。

如果您想从 Spring 批处理代码开始,您需要使用 JobExplorer and apply filters on either START_TIME or END_TIME. Alternatively, just send an SQL query with your desired JOIN to the DB using JDBC. The DDLs of the metadata tables can be found here.

编辑

如果你想尝试在 Spring 批处理中进行,我想你需要遍历 JobExecutions 并找到你感兴趣的,然后做你的事 )) 某事。喜欢:

List<JobInstance> jobInstances = jobExplorer.getJobInstances(jobName);

for (JobInstance jobInstance : jobInstances) {
    List<JobExecution> jobExecutions = jobExplorer.getJobExecutions(jobInstance);
    for (JobExecution jobExecution : jobExecutions) {
        if (//jobExecution.getWhatever...)) {
        // do your thing...
        }
     }
} 

祝你好运!

因为 JobExplorer 不再有接口 .getJobInstances(jobName),我已经完成了这个(这个例子以 BatchStatus 作为条件)适应流:

List<JobInstance> lastExecutedJobs = jobExplorer.getJobInstances(jobName, 0, Integer.MAX_VALUE);

Optional<JobExecution> jobExecution = lastExecutedJobs
                                .stream()
                                .map(jobExplorer()::getJobExecutions)
                                .flatMap(jes -> jes.stream())
                                .filter(je -> BatchStatus.COMPLETED.equals(je.getStatus()))
                                .findFirst();

对于 return N 个元素,您可以使用流的其他容量(限制、最大值、收集器...)。