【发布时间】:2021-05-11 18:38:02
【问题描述】:
我刚刚从 REST 端点触发的 spring 批处理作业切换到命令行作业运行方法。
我删除了具有JobLauncher 的控制器类。
现在我正在尝试使用以下命令运行该作业:
java -Dspring.batch.job.names="SOME JOBNAME" -jar somejar.jar
我看到BATCH_JOB_EXECUTION_PARAMS 表中默认传递了run.id 和time 作业参数。
当我使用 REST 端点启动器方法触发作业时,我没有看到默认传递这些参数。
在每个作业运行中都传递了这两个参数的相同值。
run.id=1 和 time=1612515999654。
正如预期的那样,它给了我以下JobInstanceAlreadyComplete 异常。
我的工作 bean 是这样的:
@Bean
public Job job() throws Exception {
return this.jobBuilderFactory.get("SOME JOBNAME")
.incrementer(new RunIdIncrementer())
.start(someStep())
.build();
}
我通过扩展我使用的DefaultBatchConfigurer 类覆盖了这个createJobRespository() 方法,因为我的元数据表在sql server db 中的模式与默认的dbo 模式不同。
@Override
protected JobRepository createJobRepository() throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setTransactionManager(transactionManager);
factory.setTablePrefix("someSchema" + ".BATCH_");
factory.afterPropertiesSet();
return factory.getObject();
}
当我删除 createJobRespository() 方法并因此在默认 dbo 架构中使用批处理元数据表时,默认情况下仅传递 run.id 并按预期递增。在这种情况下,默认不传递time 参数。
我的问题是:
- 当我使用命令行触发作业时,为什么默认传递
time和run.id作业参数? - 为什么每次运行作业时传递的两个参数的值都相同?即使我使用的是
new RunIdIncrementer() -
createJobRespository()方法是如何产生差异的?
【问题讨论】:
-
run.id 将递增,您可以检查 table select * from BATCH_JOB_EXECUTION_PARAMS bjep order by 1 desc 。这些是默认参数。
标签: java spring spring-boot spring-batch