【问题标题】:Srping Batch - easiest way to get aggregated data (read, writes, step exit status, job exit status) from multiple Jobs/Steps run in the pastSpring Batch - 从过去运行的多个作业/步骤中获取聚合数据(读取、写入、步骤退出状态、作业退出状态)的最简单方法
【发布时间】:2021-09-16 21:49:29
【问题描述】:

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

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

我确实看到了 JobExplorer bean,但是,在从元数据表中获取记录之前,所有方法看起来都需要像 JobId 这样的信息,我没有 strong> 在所有 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 POSThttp://base-url/getBatchReport

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

【问题讨论】:

    标签: java spring spring-boot spring-batch


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-30
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 2021-11-05
      相关资源
      最近更新 更多