Spring 批次 - 两个不同的批次可以共享同一个元数据数据源吗?
Spring Batch - Can two different batches share the same Meta-Data datasource?
我有两个不同的 Spring 批处理项目,它们都配置为元数据表具有相同的数据源(相同的数据库架构):
application.properties(Spring批次A)
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/my_batch
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_NAME
和 JOB_KEY
的组合不是唯一的。
JOB_NAME
和 JOB_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();
我有两个不同的 Spring 批处理项目,它们都配置为元数据表具有相同的数据源(相同的数据库架构):
application.properties(Spring批次A)
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/my_batch
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_NAME
和 JOB_KEY
的组合不是唯一的。
JOB_NAME
和 JOB_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();