【问题标题】:Spring batch job parameters are not overriding even if I change in job parameter validator即使我更改作业参数验证器,Spring 批处理作业参数也不会被覆盖
【发布时间】:2019-08-01 14:49:45
【问题描述】:

我有一个作业参数验证器,其中我提到了强制和可选参数。我运行批处理并正确执行。

@Bean
    public JobParametersValidator validator() {

    String[] compulsoryParameters; //here I've created my compulsory parameters
    String[] optionalParams ; //here I've created my optional parameters

    return new DefaultJobParametersValidator(compulsoryParameters, optionalParams);
}

现在,如果我从强制参数中删除一个项目并再次运行它。它仍然要求传递相同的参数。

Caused by: org.springframework.batch.core.JobParametersInvalidException: The JobParameters contains keys that are not explicitly optional or required: [incrementerId]
        at org.springframework.batch.core.job.DefaultJobParametersValidator.validate(DefaultJobParametersValidator.java:107)
        at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:126)

批量配置

必填/可选参数在application.properties中配置

mybatch.batch.compulsoryParameters=name

mybatch.batch.optionalParameters=inputNumber

@Configuration
@EnableTransactionManagement
@EntityScan(basePackages = "com.something.*")
@EnableJpaRepositories(basePackages = "com.something.*")
@EnableBatchProcessing
@EnableCaching
@EnableConfigurationProperties
@Getter
@Setter
@ConfigurationProperties(prefix = "mybatch.batch", ignoreUnknownFields = false)
public class BatchConfig {

    /**
     * Configuration settings for the validator
     */
    private String[] compulsoryParameters;
    private String[] optionalParameters;

    /**
     * Default validator for Spring Batch
     *
     * @return
     */
    @Bean
    public JobParametersValidator validator() {

        List<String> tempList = new ArrayList<>();
        if (optionalParameters != null) {
            Collections.addAll(tempList, optionalParameters);
        }

        // Adding the run.id parameter for enabling the rerun batches
        tempList.add("run.id");
        String[] optionalParams = new String[tempList.size()];
        optionalParams = tempList.toArray(optionalParams);

        return new DefaultJobParametersValidator(compulsoryParameters, optionalParams);
    }


}

注意:所有作业详细信息都保存在数据库中。

【问题讨论】:

  • 你能删除@EnableCaching然后运行它吗?另外我会说将ignoreUnknownFields 设为true,然后检查您是否以某种方式获得旧记录?
  • 不!我试过了。我遇到了同样的问题
  • 旧记录检查呢?
  • 旧记录检查是什么意思?我的问题是,1. 我用 3 个强制/可选参数定义了 JobParameter Validator。 2. 我使用 3 个参数运行作业 - 成功 3. 我删除了 1 个参数,现在我在 JPValidator 中有 2 个参数。 4. 我用 2 个参数运行作业 - 作业失败 它需要我在项目中没有提到的第三个参数。
  • @nmkyuppie 你现在找到解决方案了吗?

标签: spring spring-batch spring-batch-job-monitoring


【解决方案1】:

正如错误明确指出的那样,每个参数要么必须是 compulsoryParametersoptionalParams 的一部分。

例如,对于我的工作,传递三个参数 START_DATE、RUN_DATE 和 END_DATE。我已将所有内容都包含在 compulsoryParameters 中,如果我从该列表中删除一个并继续传递,那么它会错误提示参数中有一个键未明确添加到任一列表中。

@Bean
    public JobParametersValidator validator() {
        String[] compulsoryParameters = {"START_DATE", "RUN_DATE", "END_DATE"}; //here I've created my compulsory parameters
        String[] optionalParams = {""}; //here I've created my optional parameters

        return new DefaultJobParametersValidator(compulsoryParameters, optionalParams);
    }

所以尝试添加通过添加到compulsoryParametersoptionalParams 传递的所有参数。这应该可以解决问题。

【讨论】:

  • 感谢您的回答。但它没有回答我的问题。在上面的示例中,我之前将 incrementerId 作为强制/可选参数。第一次运行后,我将其从代码中删除。从强制/可选的 Params.@amit 中删除后,我得到了该异常
  • @nmkyuppie 从强制/可选参数中删除后,您是否继续在JobParameters 中传递它?
  • 不!我已经在 comp/opt 参数中删除了它。所以我没有通过。它仍然要求 incrementerId
  • 你能上传所有的批处理配置吗?我也没有看到您添加强制/可选参数的代码?
猜你喜欢
  • 2021-12-17
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多