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_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;
由于我的作业名称是一个常量,我需要确保每次运行批处理时 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 服务器吗?
BAPI_BATCH_CREATE创建批次MCH1没有CUOBJ_BM值