Spring Batch - 两个不同的批次可以共享相同的元数据数据源吗?

时间:2017-06-23 17:36:06

标签: java spring spring-batch datasource

我有两个不同的Spring Batch项目,两者都配置为具有相同的数据源(相同的数据库模式)用于元数据表:

  1. application.properties (Spring Batch A)

    spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/my_batch
    
  2. application.properties (Spring Batch B)

    spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/my_batch
    

  3. 在成功运行Spring Batch A多次之后,我运行了Spring Batch B并抛出了JobExecutionAlreadyRunningException

    示例:

      

    org.springframework.batch.core.repository.JobExecutionAlreadyRunningException:此作业的作业执行已在运行:JobInstance:id = 2,JobParameters = [{}],Job = [MyBatchName]


    在此期间,Spring Batch A不再运行。该异常似乎表明Spring Batch A已经使用了作业实例ID,并且Spring Batch B无法使用该实例ID。

    问题:

      

    Spring Batch Meta-Data Schema可以支持多个Spring Batch项目吗?

3 个答案:

答案 0 :(得分:1)

他们可以,但你需要确保工作中的事物是独一无二的。具体而言,作业名称和标识参数必须是唯一的。因此,如果JobA和JobB都具有相同的名称,您将遇到冲突。

答案 1 :(得分:0)

if (status.isRunning() || status == BatchStatus.STOPPING)为你的工作然后批处理将抛出JobExecutionAlreadyRunningException。你能否检查元数据表中作业或工作步骤的状态。

如果可能,您可以重新创建元数据表并进行检查。

答案 2 :(得分:0)

根据Micheal Minella的建议,碰撞的根本原因是JOB_NAMEJOB_KEY的组合不是唯一的。


JOB_NAMEJOB_KEY的定义:

  

JOB_NAME:Job对象获取的作业的名称。因为需要标识实例,所以它不能为空。

     

JOB_KEY: JobParameters的序列化,它唯一地标识了相同作业的不同实例。


BATCH_JOB_INSTANCE表格创建SQL

CREATE TABLE BATCH_JOB_INSTANCE  (
    JOB_INSTANCE_ID BIGINT  NOT NULL PRIMARY KEY ,
    VERSION BIGINT ,
    JOB_NAME VARCHAR(100) NOT NULL,
    JOB_KEY VARCHAR(32) NOT NULL,
    constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY)
) ENGINE=InnoDB; 

由于我的作业名称是常量,因此我需要确保每次运行批处理时JobParameters都是唯一的。根据{{​​3}}的建议,我们可以添加System.currentTimeMillis()作为参数。

JobParameters jobParameters = new JobParametersBuilder()
      .addLong("time",System.currentTimeMillis()).toJobParameters();