Java Spring批处理-两个不同的批处理可以共享相同的元数据数据源吗?
我有两个不同的Spring批处理项目,它们都配置为元数据表具有相同的数据源(相同的DB模式):Java Spring批处理-两个不同的批处理可以共享相同的元数据数据源吗?,java,spring,spring-batch,datasource,Java,Spring,Spring Batch,Datasource,我有两个不同的Spring批处理项目,它们都配置为元数据表具有相同的数据源(相同的DB模式): application.properties(弹簧批次A) application.properties(弹簧批B) 在多次成功运行Spring批处理A之后,我运行了Spring批处理B,它抛出了一个JobExecutionAlreadyRunningException 例如: org.springframework.batch.core.repository.JobExecutionReady
在多次成功运行Spring批处理A之后,我运行了Spring批处理B,它抛出了一个
JobExecutionAlreadyRunningException
例如:
org.springframework.batch.core.repository.JobExecutionReadyRunningException:此作业的作业执行已在运行:JobInstance:id=2,JobParameters=[{}],job=[MyBatchName]
在此期间,Spring批次A不再运行。异常似乎表明作业实例ID已由Spring批处理A获取,不能由Spring批处理B使用 问题: Spring批处理元数据模式能否支持多个Spring批处理项目
他们可以,但你需要确保工作中的事情是独一无二的。具体而言,作业名称和标识参数必须是唯一的。因此,如果JobA和JobB都有相同的名称,您将遇到冲突。
如果(status.isRunning()| | status==BatchStatus.STOPPING)
对于您的作业,batch将抛出JobExecutionAlreadyRunningException
。请在元数据表中检查作业或作业步骤的状态
一旦可能,您可以重新创建元数据表并进行检查 正如Micheal Minella所说,碰撞的根本原因是由于
作业名称
和作业密钥
的组合不是唯一的
JOB\u NAME
和JOB\u KEY
的定义:
作业\u名称:从作业
对象获取的作业的名称。因为需要标识实例,所以它不能为null
JOB\u键:作业参数的序列化,它唯一地标识同一作业的不同实例
批处理作业实例
表创建
因为我的作业名称是一个常量,所以每次运行批处理时,我都需要确保
JobParameters
是唯一的。正如所建议的,我们可以添加System.currentTimeMillis()
作为参数
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time",System.currentTimeMillis()).toJobParameters();
它应该抛出异常一个作业实例已经存在并且参数为{}的作业实例已经完成,因为我没有使用MVC,为了添加
JobParameters
,我必须从我的应用程序类手动启动作业,并设置spring.batch.job.enabled=false
,以避免作业运行两次。参考:
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/my_batch
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 jobParameters = new JobParametersBuilder()
.addLong("time",System.currentTimeMillis()).toJobParameters();