我刚刚从 REST 端点触发的 Spring 批处理作业切换到命令行作业运行方法。
我删除了具有 JobLauncher
的控制器类。
现在我正在尝试使用以下命令运行作业:
java -Dspring.batch.job.names="SOME JOBNAME" -jar somejar.jar
我看到 run.id
和 time
作业参数默认在 BATCH_JOB_EXECUTION_PARAMS
表中传递。
当我使用 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();
}
我通过扩展我使用的 createJobRespository()
类覆盖了这个 DefaultBatchConfigurer
方法,因为我的元数据表在 sql server db 中的架构与默认的 dbo
架构不同。< /p>
@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()
方法是如何产生差异的?答案 0 :(得分:0)
为什么当我使用命令行触发作业时,默认会传递这个 time 和 run.id 作业参数?
根据您的作业定义,只应将 run.id
参数添加到 RunIdIncrementer
的作业参数中。我从您分享的内容中看不出此 time
参数的来源。
为什么每次运行作业时传递的两个参数的值都相同?即使我使用的是新的 RunIdIncrementer()
事实并非如此。使用 RunIdIncrementer
,每次新运行都应生成新的 run.id
。如果不是这种情况,请提供重现该问题的 minimal example。
createJobRespository() 方法是如何产生差异的?
我不明白这与问题有什么关系。作业存储库不会以任何方式影响作业参数。