wlt*_*eng 6 java spring datasource spring-batch
我有两个不同的 Spring Batch 项目,它们都配置为元数据表具有相同的数据源(相同的 DB 模式):
application.properties(Spring Batch A)
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/my_batch
Run Code Online (Sandbox Code Playgroud)application.properties(Spring Batch B)
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/my_batch
Run Code Online (Sandbox Code Playgroud)
在多次成功运行 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 项目吗?
正如 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;
Run Code Online (Sandbox Code Playgroud)
JobParameters由于我的作业名称是一个常量,因此每次运行批处理时我都需要确保它们是唯一的。根据Mkyong的建议,我们可以添加System.currentTimeMillis()作为参数。
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time",System.currentTimeMillis()).toJobParameters();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1686 次 |
| 最近记录: |