springbatch多实例控制原理

2018-06-10  本文已影响0人  西风胡杨

批处理,部署到生产一般都是多个实例,springbatch是如何保证在多个实例中一个job只运行一次呢?
springbatch在调用jobLaunch.run方法拉起一个job时,会创建jobInstance,创建jobInstance逻辑如下图:

jobinstance.jpg
  1. 检查lastExecution是否为空。lastExecution是当前job上一次的执行器,如果该job是首次运行,lastExecution即为空,如果已经执行过,lastExecution不为空。

  2. 如果lastExecution为空,表明该job是首次执行,开始创建jobExecution。

  3. 如果lastExecution不为空,表明该job已经执行过,再判断该job是否可以重复执行,如果可以重复执行,创建jobExecution,如果不可以,抛出异常“JobInstance already exists and is not restartable”。

那么问题来了? 如果多实例同时启动,如下图,实例2在获取lastExecution时,实例1创建jobExecution还未完成,实例2获取到的lastExecution为空,接着实例2也会创建jobExecution,那实例2创建会成功么? 如果会成功,也就是该job可以在多个实例上跑多次。

mulinstance.jpg

答案是,实例2创建jobExecution肯定不会成功,那springbatch是怎么控制的呢?

上一篇 下一篇

猜你喜欢

热点阅读