srping批处理-从过去运行的多个作业/步骤中获取聚合数据(读取、写入、步骤退出状态、作业退出状态)的最简单方法

ars1skjm  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(198)

我有一个spring批处理应用程序,它运行一个作业和一个步骤(该步骤对数据库进行读取、处理和写入)。jobparameters是(csv的)文件名和aws区域(当csv加载到aws s3 bucket时,spring批处理作业开始)。问题是另一个团队每晚都会触发批处理作业(使用脚本将csv加载到s3 bucket),这会启动作业(从csv读取数据)。这需要一个小时,并且在夜间重复几次(最多7次)。
我知道我可以使用jobexecutionlistener或stepexecutioner listener获取正在进行的作业/步骤的元数据,但由于它们正在运行多个作业,我希望聚合一个涵盖所有这些作业的报告,并且我可以提供作业和步骤的读/写计数、退出状态。我也希望在之后能够这样做,所以我不应该依赖于当前正在运行的作业/步骤,比如jobexecution/stepexecution如何在stepexecutionlisteners中获取数据(据我所知)。
我确实看到了jobexplorer bean,但是,在从元数据表中获取记录之前,所有的方法看起来都需要像jobid这样的信息,而在所有7个作业都运行之后,我就不需要这些信息了,除非我假设我将它保存在某个地方。我想我可以创建一些@实体来表示元表(batch_job_execution,batch_step_execution,等等),然后使用jpa方法通过jobparameters来查询它们(我会这样做,因为加载csv文件的团队会有这些数据,而不是我前面提到的jobinstanceid)。不过这似乎有点过分了。
简单地获取一组特定的作业,然后从作业中获取过去发生的作业/步骤的步骤数据,最简单的方法是什么?所谓“过去”,我的意思是,也许我会在spring批处理应用程序中创建一个http端点,用户可以在其中发布文件名,然后在实际作业/步骤完成后的许多分钟/小时/天内返回相应作业/步骤的所有元数据。
我把事情复杂化了吗?有没有更简单的方法?
理想情况下,我的“报告”如下所示,如果它是通过spring批处理应用程序中的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
]
}

8gsdolmq

8gsdolmq1#

我确实看到了jobexplorer bean,但是,在从元数据表获取记录之前,所有方法看起来都需要像jobid这样的信息 JobExplorer#getJobInstances 获取作业名称(和计数),并提供与作业对应的作业示例。在您的情况下,您可以执行以下操作:

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

这将为您提供要查找的作业示例(如果region是标识作业参数,则每个文件和/或区域有一个作业示例)。从那里,您可以通过查看作业示例的参数、执行时间等来过滤作业示例,并深入到作业执行和步骤执行,以创建聚合报告。

相关问题