Java Spring批处理-两个不同的批处理可以共享相同的元数据数据源吗?

Java Spring批处理-两个不同的批处理可以共享相同的元数据数据源吗?,java,spring,spring-batch,datasource,Java,Spring,Spring Batch,Datasource,我有两个不同的Spring批处理项目,它们都配置为元数据表具有相同的数据源(相同的DB模式): application.properties(弹簧批次A) application.properties(弹簧批B) 在多次成功运行Spring批处理A之后,我运行了Spring批处理B,它抛出了一个JobExecutionAlreadyRunningException 例如: org.springframework.batch.core.repository.JobExecutionReady

我有两个不同的Spring批处理项目,它们都配置为元数据表具有相同的数据源(相同的DB模式):

  • application.properties(弹簧批次A)

  • application.properties(弹簧批B)


  • 在多次成功运行Spring批处理A之后,我运行了Spring批处理B,它抛出了一个
    JobExecutionAlreadyRunningException

    例如:

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


    在此期间,Spring批次A不再运行。异常似乎表明作业实例ID已由Spring批处理A获取,不能由Spring批处理B使用

    问题:

    Spring批处理元数据模式能否支持多个Spring批处理项目


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

    如果(status.isRunning()| | status==BatchStatus.STOPPING)
    对于您的作业,batch将抛出
    JobExecutionAlreadyRunningException
    。请在元数据表中检查作业或作业步骤的状态


    一旦可能,您可以重新创建元数据表并进行检查

    正如Micheal Minella所说,碰撞的根本原因是由于
    作业名称
    作业密钥
    的组合不是唯一的


    JOB\u NAME
    JOB\u KEY
    的定义:

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

    JOB\u键:作业参数的序列化,它唯一地标识同一作业的不同实例


    批处理作业实例
    表创建

    因为我的作业名称是一个常量,所以每次运行批处理时,我都需要确保
    JobParameters
    是唯一的。正如所建议的,我们可以添加
    System.currentTimeMillis()
    作为参数

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

    它应该抛出异常一个作业实例已经存在并且参数为{}的作业实例已经完成,因为我没有使用MVC,为了添加
    JobParameters
    ,我必须从我的应用程序类手动启动作业,并设置
    spring.batch.job.enabled=false
    ,以避免作业运行两次。参考:
    spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/my_batch
    
    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 jobParameters = new JobParametersBuilder()
          .addLong("time",System.currentTimeMillis()).toJobParameters();