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

时间:2017-06-08 08:14:59

标签: spring-mvc spring-boot spring-data-jpa spring-batch

Spring批处理新人,所以,期待什么。

我的作业使用给定的作业参数paymentPeriod=1成功运行完成。虽然要求期望作业能够使用相同的作业参数paymentPeriod=1重新运行。

我可以使用参数paymentPeriod=1第一次运行作业,并使用postman中的以下端点

@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 个答案:

答案 0 :(得分:1)

通过Spring Batch中的作业实例和作业执行的概念,您无法再次启动COMPLETED作业实例,尽管您可以再次启动相同的作业实例&再次,直到它不完整(和更多的工作状态)。

作业实例的唯一性由jobId&工作参数。

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

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

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

java.lang.System.currentTimeMillis()转换为字符串,并使用String.format("paymentPeriod=%s", paymentPeriod+java.lang.System.currentTimeMillis())而不是您当前的内容附加到您的参数。

希望你能得到这个想法。