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

Spring Batch - Can two different batches share the same Meta-Data datasource?

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

  1. application.properties(Spring批次A)

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

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


成功运行Spring批次A后,我运行Spring批次B它扔了一个JobExecutionAlreadyRunningException

示例:

org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running: JobInstance: id=2, JobParameters=[{}], Job=[MyBatchName]


在那段时间里,Spring 批次 A 不再是 运行。该异常似乎表明作业实例 ID 已被 Spring 批次 A 占用,无法被 Spring 批次 B 使用。

问题:

Can a Spring Batch Meta-Data Schema support multiple Spring Batch projects?

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

if (status.isRunning() || status == BatchStatus.STOPPING) 对于您的作业,然后批处理将抛出 JobExecutionAlreadyRunningException。您能否检查元数据 table 作业或作业步骤的状态是什么。

如果可能,您可以重新创建元数据 table 并检查一次。

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


JOB_NAMEJOB_KEY 的定义:

JOB_NAME: Name of the job obtained from the Job object. Because it is required to identify the instance, it must not be null.

JOB_KEY: A serialization of the JobParameters that uniquely identifies separate instances of the same job from one another.


BATCH_JOB_INSTANCE table 创作 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 都是唯一的。根据Mkyong的建议,我们可以添加System.currentTimeMillis()作为参数。

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