Spring Batch - 使用相同的作业参数重新运行作业

Posted

技术标签:

【中文标题】Spring Batch - 使用相同的作业参数重新运行作业【英文标题】:Spring Batch - Rerun Job with same Job Parameter 【发布时间】:2017-11-09 20:16:26 【问题描述】:

Spring Batch 新人来了,所以,期待什么。

我有一个使用给定的作业参数paymentPeriod=1 成功运行到完成的作业。尽管要求希望该作业能够使用相同的作业参数 paymentPeriod=1 重新运行。

我可以第一次使用参数paymentPeriod=1 运行作业,并使用来自邮递员的以下端点

@RestController
@RequestMapping(value = "api/jobs")
public class JobController 
    @Autowired
    private JobOperator jobOperator;

    @RequestMapping(value = "/pay/paymentPeriod", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.ACCEPTED)
    public void launchPaymentJob(@PathVariable Integer paymentPeriod) throws Exception 
        this.jobOperator.start("paymentJob", String.format("paymentPeriod=%s", paymentPeriod));
    

虽然当我使用相同的参数重新运行时,我得到 JobInstanceAlreadyExistsException 无法启动名称为 paymentJobparameters=paymentPeriod=1 的作业实例

【问题讨论】:

【参考方案1】:

按照 Spring Batch 中的作业实例和作业执行的概念,您不能再次启动已完成的作业实例,尽管您可以再次启动相同的作业实例直到它未完成(以及更多的作业状态)。

作业实例的唯一性是通过 jobId 和作业参数来实现的。

因此,如果您不更改参数,则无法使用相同的实例启动已完成的作业。

如果您的 REST 端点被限制为一次又一次地采用相同的值,您需要在该方法中添加一个唯一参数,这很可能是 - java.lang.System.currentTimeMillis()

您可以使用任何其他唯一值,尽管当前系统时间非常方便。

java.lang.System.currentTimeMillis() 转换为 String 并使用 String.format("paymentPeriod=%s", paymentPeriod+java.lang.System.currentTimeMillis()) 之类的东西附加到您的参数,而不是您当前的值。

希望您能理解。

【讨论】:

感谢您的回复,不过我有疑问。当我将参数作为paymentPeriod时间戳的 concat 传递时,在作业失败时如何动态获取唯一的作业实例值以重新启动 通过使用JobExplorer 查询您的元数据表,您几乎不需要那个精确的ID,因为方法看起来像这样,List<JobInstance> lastInstances = jobExplorer.getJobInstances( job.getName(), 0, 1); 文档是here 如何使用JobOperatorpaymentPeriodSystem.currentTimeMillis() 作为两个参数传递,以便我可以在ItemReader 实现中使用@Value("#jobParameters['paymentPeriod']") final Integer paymentPeriodId 轻松选择paymentPeriod (doc)[docs.spring.io/spring-batch/apidocs/org/springframework/batch/… 说parameters - the parameters to launch it with (comma or newline separated name=value pairs) 所以你不要连接......只需将它作为新参数传递给paymentPeriod=1,time=...

以上是关于Spring Batch - 使用相同的作业参数重新运行作业的主要内容,如果未能解决你的问题,请参考以下文章

Spring Batch 从相同的执行和步骤重新启动未完成的作业

Spring Cloud Task 参数不会传播到 Spring Batch 作业参数

从 tasklet 步骤将参数添加到作业上下文并在 Spring Batch 的后续步骤中使用

Spring Batch Job 获取先前的执行参数

群集环境中的Java Batch作业

如何将 Spring Batch Cron 作业迁移到 Spring Cloud 任务