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
无法启动名称为 paymentJob
和 parameters=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
如何使用JobOperator
将paymentPeriod
和System.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 作业参数