我有两个不同的Spring Batch项目,两者都配置为具有相同的数据源(相同的数据库模式)用于元数据表:
application.properties (Spring Batch A)
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/my_batch
application.properties (Spring Batch B)
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不再运行。该异常似乎表明Spring Batch A已经使用了作业实例ID,并且Spring Batch B无法使用该实例ID。
问题:
Spring Batch Meta-Data Schema可以支持多个Spring Batch项目吗?
答案 0 :(得分:1)
他们可以,但你需要确保工作中的事物是独一无二的。具体而言,作业名称和标识参数必须是唯一的。因此,如果JobA和JobB都具有相同的名称,您将遇到冲突。
答案 1 :(得分:0)
if (status.isRunning() || status == BatchStatus.STOPPING)
为你的工作然后批处理将抛出JobExecutionAlreadyRunningException
。你能否检查元数据表中作业或工作步骤的状态。
如果可能,您可以重新创建元数据表并进行检查。
答案 2 :(得分:0)
根据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
都是唯一的。根据{{3}}的建议,我们可以添加System.currentTimeMillis()
作为参数。
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time",System.currentTimeMillis()).toJobParameters();