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

Posted

技术标签:

【中文标题】Spring Batch - 两个不同的批次可以共享相同的元数据数据源吗?【英文标题】:Spring Batch - Can two different batches share the same Meta-Data datasource? 【发布时间】:2017-11-27 08:50:18 【问题描述】:

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

    application.properties (Spring Batch A)

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

    application.properties (Spring Batch)

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

在成功运行 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 项目?

【问题讨论】:

【参考方案1】:

他们可以,但您需要确保工作中的事情是独一无二的。具体来说,作业名称和标识参数必须是唯一的。所以如果 JobA 和 JobB 同名,就会发生冲突。

【讨论】:

它应该抛出异常作业实例已经存在并且参数已完成=【参考方案2】:

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

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

【讨论】:

附带说明,因为我没有使用 MVC,为了添加 JobParameters,我必须从我的 Application 类手动启动作业,并设置 spring.batch.job.enabled=false 以避免作业运行两次。参考:***.com/a/25185150/5366727【参考方案3】:

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

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

【讨论】:

以上是关于Spring Batch - 两个不同的批次可以共享相同的元数据数据源吗?的主要内容,如果未能解决你的问题,请参考以下文章

我总是需要一个带有 Spring 集成的 Web 服务器吗?

CI 更新批次;连接和递增变量和字符串作为数组值

BAPI_BATCH_CREATE创建批次MCH1没有CUOBJ_BM值

如何处理批次内不同实例中的不确定句子数量?

为啥 Spring Batch 为每个线程使用 1 个数据库连接?

在 Tensorflow 中将数据拆分为批次进行分类