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
无法启动已存在且名称为paymentJob
且parameters=paymentPeriod=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())
而不是您当前的内容附加到您的参数。
希望你能得到这个想法。