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

wlt*_*eng 6 java spring datasource spring-batch

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

  1. application.properties(Spring Batch A)

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

    spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/my_batch
    
    Run Code Online (Sandbox Code Playgroud)


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

例子:

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


在此期间,Spring Batch A 不再运行。异常似乎表明 Job Instance ID 已经被 Spring Batch A 占用,不能被 Spring Batch B 使用。

题:

Spring Batch 元数据模式可以支持多个 Spring Batch 项目吗?

Mic*_*lla 5

他们可以,但你需要确保不同工作之间的情况是独一无二的。具体来说,作业名称和标识参数必须是唯一的。因此,如果 JobA 和 JobB 具有相同的名称,则会遇到冲突。


wlt*_*eng 4

正如 Micheal Minella 所指出的,碰撞的根本原因是 的组合,JOB_NAME并且JOB_KEY不是唯一的。


JOB_NAME和 的定义JOB_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; 
Run Code Online (Sandbox Code Playgroud)

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

JobParameters jobParameters = new JobParametersBuilder()
      .addLong("time",System.currentTimeMillis()).toJobParameters();
Run Code Online (Sandbox Code Playgroud)