每个春季批处理作业运行中传递的相同参数

时间:2021-02-08 06:29:42

标签: java spring spring-boot spring-batch

我刚刚从 REST 端点触发的 Spring 批处理作业切换到命令行作业运行方法。 我删除了具有 JobLauncher 的控制器类。 现在我正在尝试使用以下命令运行作业:

<块引用>

java -Dspring.batch.job.names="SOME JOBNAME" -jar somejar.jar

我看到 run.idtime 作业参数默认在 BATCH_JOB_EXECUTION_PARAMS 表中传递。 当我使用 REST 端点启动器方法触发作业时,我没有看到默认情况下传递这些参数。

并且在每个作业运行中传递这两个参数的相同值。 run.id=1time=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 参数。

我的问题是:

  1. 当我使用命令行触发作业时,为什么默认传递此 timerun.id 作业参数?
  2. 为什么每次运行作业时传递的两个参数的值都相同?即使我使用的是 new RunIdIncrementer()
  3. createJobRespository() 方法是如何产生差异的?

1 个答案:

答案 0 :(得分:0)

<块引用>

为什么当我使用命令行触发作业时,默认会传递这个 time 和 run.id 作业参数?

根据您的作业定义,只应将 run.id 参数添加到 RunIdIncrementer 的作业参数中。我从您分享的内容中看不出此 time 参数的来源。

<块引用>

为什么每次运行作业时传递的两个参数的值都相同?即使我使用的是新的 RunIdIncrementer()

事实并非如此。使用 RunIdIncrementer,每次新运行都应生成新的 run.id。如果不是这种情况,请提供重现该问题的 minimal example

<块引用>

createJobRespository() 方法是如何产生差异的?

我不明白这与问题有什么关系。作业存储库不会以任何方式影响作业参数。