首页 > 解决方案 > Srping Batch - 从过去运行的多个作业/步骤中获取聚合数据(读取、写入、步骤退出状态、作业退出状态)的最简单方法

问题描述

我有一个 Spring Batch 应用程序,它运行 1 个作业和 1 个步骤(执行一些读取、处理和写入数据库的步骤)。JobParameters 是文件名(CSV 的)和 AWS 区域(Spring Batch 作业在 CSV 加载到 AWS S3 存储桶时启动)。问题是另一个团队每晚触发批处理作业(使用脚本将 CSV 加载到 S3 存储桶),这会启动作业(从 CSV 读取数据)。这最多需要一个小时,并且整个晚上都会重复几次(最多约 7 个作业)。

我知道我可以使用 JobExecutionListener 或 StepExecutioner 侦听器来获取 Job/Step AS IT IS OCCURING的元数据,但是由于它们正在运行多个作业,我想汇总一个涵盖所有这些作业的报告,我可以提供Job 和 Step 的读/写计数、退出状态。我也希望能够在之后执行此操作,因此我不应该依赖当前正在运行的 Job/Step,例如 jobExecution/stepExecution 如何在 StepExecutionListeners 中获取它们的数据(据我了解)。

我确实看到了JobExplorer bean,但是,在从元数据表中获取记录之前,所有方法看起来都需要像 JobId 这样的信息,在运行完所有 7 个作业之后我不会拥有这些信息,除非我想我正在保存它某处。我想我可以创建一些@Entities 来表示元表(batch_job_execution、batch_step_execution 等),然后使用 Jpa 方法通过 JobParameters 来查询它们(我本来可以这样,因为团队加载了 CSV文件将具有该数据,但不是我之前所说的 JobInstanceId)。不过,这似乎有点矫枉过正。

简单地获取一组特定的作业然后从作业中获取过去发生的作业/步骤的步骤数据的最简单方法是什么?通过“过去”,我的意思是,也许我会在我的 Spring Batch 应用程序中创建一个 HTTP 端点,用户可以在其中发布文件名,然后可以在几分钟/几小时/几天后返回相应作业/步骤的所有元数据实际的作业/步骤已完成。

我是否过于复杂了?有没有更简单的方法?

理想情况下,我的“报告”如下所示,如果它是通过我的 Spring Batch 应用程序中的 HTTP 控制器触发的,那么我还可以使用 JavaMail 或 JakartaMail 发送给投资于该数据是否成功加载的用户:

mailSubject: BATCH JOB 07/06/2021 04:07:50 completed with STATUS {exitCode=COMPLETED}

mailBody:
job [myCustomSpringBatchJob] with step [myCustomSpringBatchStep] for fileName [dummyFileName1.csv] completed with STATUS [COMPLETED] read 320,343 / write 320,343

job [myCustomSpringBatchJob] with step [myCustomSpringBatchStep] for fileName [dummyFileName2.csv] completed with STATUS [EXECUTING] read 20,343 / write 400,343

job [myCustomSpringBatchJob] with step [myCustomSpringBatchStep] for fileName [dummyFileName3.csv] completed with STATUS [FAILED] read 23 / write 24

job [myCustomSpringBatchJob] with step [myCustomSpringBatchStep] for fileName [dummyFileName4.csv] completed with STATUS [COMPLETED] read 200,778 / write 200,778

如您所见,它将是有关特定作业运行的汇总报告。HTTP 端点可以接受这样的 POST 请求:

HTTP POST ,http://base-url/getBatchReport

{
    "fileNames": [dummyFileName1.csv,
             dummyFileName2.csv,
             dummyFileName3.csv,
             dummyFileName4.csv
       ],
    "mailingList": [johndoe1@gmail.com,
             heatherjack@hotmail.com,
             mrsmithers@nike.com
             ]                   
}

标签: javaspringspring-bootspring-batch

解决方案


我确实看到了 JobExplorer bean,但是,在从元数据表中获取记录之前,所有方法看起来都需要像 JobId 这样的信息

JobExplorer#getJobInstances接受作业名称(和计数)并为您提供与您的作业相对应的作业实例。在您的情况下,您可以执行以下操作:

List<JobInstance> jobInstances = jobExplorer.getJobInstances("myCustomSpringBatchJob", 0, 10);

这将为您提供您正在寻找的作业实例(如果区域是识别作业参数,则每个文件和/或区域一个作业实例)。从那里,您可以通过查看它们的参数、执行时间等来过滤作业实例,并深入到作业执行和步骤执行以创建汇总报告。


推荐阅读