2017-06-08 36 views
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)); 
    } 
} 

雖然運行工作的第一時間參數paymentPeriod=1當我有相同的參數,我得到JobInstanceAlreadyExistsException不能啓動已經與名paymentJobparameters=paymentPeriod=1

存在作業實例重新運行

回答

1

儘管您可以再次啓動相同的作業實例&,直到其未完成(並且很少),但您仍然無法再次啓動完成的作業實例更多的工作狀態)。

作業實例的唯一性是通過jobId &作業參數來實現的。

所以如果你不改變你的參數,你不能用同一個實例啓動一個完成的工作。

如果您的REST終點限制爲一次又一次地取相同的值,則需要在該方法中添加一個唯一參數,並且很可能是 - java.lang.System.currentTimeMillis()

雖然當前系統時間非常方便,但您可以使用任何其他唯一值。

java.lang.System.currentTimeMillis()轉換爲字符串,並將其附加到您的參數中,例如String.format("paymentPeriod=%s", paymentPeriod+java.lang.System.currentTimeMillis())而不是您目前的狀態。

希望你明白了。

+0

感謝您的回覆,我雖然有疑問。當我傳遞params作爲'paymentPeriod'和時間戳的concat,在作業失敗時我怎樣才能動態地獲得唯一的作業實例值來重新啓動 –

+1

通過用'JobExplorer'查詢你的元數據表你幾乎不需要那個精確的ID,因爲方法看起來像'List lastInstances = jobExplorer.getJobInstances( job.getName(),0,1);' –

+1

文檔是[here](http://docs.spring.io/spring-batch/trunk/apidocs /org/springframework/batch/core/explore/JobExplorer.html) –