在 spring 批次中配置作业的多个版本

configuring multiple versions of job in spring batch

SpringBatch 似乎缺少数据库中作业定义的元数据。

为了在数据库中创建作业实例,它唯一考虑的是jobName和jobParamter,"JobInstance createJobInstance(String jobName, JobParameters jobParameters);"

但是,Job 的对象模型足够丰富,可以考虑步骤和侦听器。因此,如果我创建现有作业的新版本,通过添加一些额外的步骤,spring 批处理不会将它与以前的版本区分开来。因此,如果我今天 运行 以前的版本和 运行 更新版本, spring 批处理不会 运行 更新版本,因为感觉以前 运行那是成功的。目前看来,作业的版本号应该是名称的一部分。这样理解正确吗?

您是正确的,框架通过作业名称和(识别)作业参数的唯一组合来识别每个作业实例。

一般来说,如果作业失败,您应该能够运行使用相同的参数重新启动失败的实例。但是,您不能重新启动已完成的实例。来自文档:

JobInstance can be restarted multiple times in case of execution failure and it's lifecycle ends with first successful execution. Trying to execute an existing JobIntance that has already completed successfully will result in error. Error will be raised also for an attempt to restart a failed JobInstance if the Job is not restartable.

所以您是对的,相同的作业名称和标识参数不能 运行 多次。无论业务步骤作业执行什么,设计框架都会阻止这种情况。同样,忽略你的工作实际做了什么,这是它的工作原理:

1) jobName=myJob, parm1=foo   , parm2=bar -> runs and fails (assume some exception)
2) jobName=myJob, parm1=foo   , parm2=bar -> restarts failed instance and completes
3) jobName=myJob, parm1=foo   , parm2=bar -> fails on startup (as expected)
4) jobName=myJob, parm1=foobar, parm2=bar -> new params, runs and completes

我们使用的"best practices"如下:

  • 每个作业实例(通常由我们正在处理的 运行 日期或文件名定义)必须定义一组唯一的参数(否则根据框架设计它将失败)
  • 一天 运行 多次但只是扫描作品 table 或其他东西的工作使用增量器传递整数参数,我们在每次成功完成时增加 1
  • 在推送影响作业正常运行的代码更改之前,必须重新启动或放弃任何失败的作业实例