springbatch多实例控制原理

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

springbatch多实例控制原理_第1张图片
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可以在多个实例上跑多次。

springbatch多实例控制原理_第2张图片
mulinstance.jpg

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

  • 实例1在创建jobExecution后,会在db的batch_job_instance写入一条记录(job_instance_id, job_name, key)其中在job_name,key(job_parameter的MD5值)上有唯一索引。

  • 实例2创建jobExecution时,因为是同一个job, job_name,key是一样的,写记录时,就会出现唯一索引冲突,创建jobExecution失败,所以多实例下,job也只会执行一次。(当然前提是isRestartable配置为false,否则可以执行多次)

你可能感兴趣的:(springbatch多实例控制原理)