Spring Batch:使用不同的参数执行相同的作业

时间:2018-09-10 19:38:46

标签: spring-batch

我是sprint批次的新手,但找不到解决我问题的答案。

我正在尝试使用Spring Boot和Spring Batch实现一个JOB。我的JOB需要一个参数,所以我要像这样执行应用程序:

  

java -jar -Dspring.profiles.active = gus   /applications/botbit-batch/botbit-batch-1.0.0.jar   --spring.batch.job.names = persistCustomerSuccessMetrics 日期= 2015-12-13

粗体字是我需要的参数。

我第一次执行该应用程序,但是在以后的执行中,我的工作始终使用我在第一次执行中传递的参数。

日志显示:

Running default command line with: 
[spring.batch.job.names=persistCustomerSuccessMetrics, date=2015-12-13]

及其后几行:

Job: [FlowJob: [name=persistCustomerSuccessMetrics]] launched with the following parameters: 
[{date=2015-12-12, -spring.batch.job.names=persistCustomerSuccessMetrics, run.id=2}]

日期2015-12-12是首次执行的日期,我无法使用其他参数再次执行该作业。

我的工作设置:

@Bean
@JobScope
public CustomerSuccessMetricsReader customerSuccessMetricsReader(@Value("#{jobParameters[date]}") String date) {
    return new CustomerSuccessMetricsReader(storeStatisticsUrl, restTemplate, date);
}
@Bean
public CustomerSuccessMetricsProcessor customerSuccessMetricsProcessor() {
    return new CustomerSuccessMetricsProcessor();
}
@Bean
public Job persistCustomerSuccessMetrics(Step persistCustomerSuccessMetricsStep1) {
    return jobBuilderFactory.get("persistCustomerSuccessMetrics").incrementer(new RunIdIncrementer())
            .listener(new CustomerSuccessMetricsCompletionListener()).flow(persistCustomerSuccessMetricsStep1).end().build();
}
@Bean
public Step persistCustomerSuccessMetricsStep1() {
    return stepBuilderFactory.
            get("persistCustomerSuccessMetricsStep1").
            <CustomerSuccessMetricsDTO, CustomerSuccessMetricsDTO> chunk(10).
            reader(customerSuccessMetricsReader(null)).
            processor(customerSuccessMetricsProcessor()).
            //writer(customerSuccessMetricsWriter).
            build();
}
  

我尝试删除 incrementer(new RunIdIncrementer())   在那种情况下,它可以正常工作,但是我无法使用相同的参数重复执行。

因此,我需要使用以下rqs来实现此工作:

  • 作业必须具有执行参数,而不是存储在数据库中的参数
  • 该作业必须支持使用相同参数的多次执行。

我将不胜感激。 问候

3 个答案:

答案 0 :(得分:1)

[背景] ,我有一个相同的问题,就是我在命令行中传递的工作参数只有一个,如下所示:

$ java -jar ./target/[java-executable-jar].jar file = [文件路径]

我已经注意到,在新的Spring批处理元数据库上,这第一次可以正常工作,之后,如果我运行了另一个文件,Spring Batch将使用存储在批处理存储库元数据库中的文件路径。

如上所述,我尝试了所有上述提议的解决方案,但均无效果。我使用了“ .incrementer(new RunIdIncrementer())”,它在使作业执行唯一化方面没有用。我还尝试将file参数作为非识别参数传递,如下所示:

$ java -jar ./target/[java-executable-jar].jar --file = [文件路径]

我也尝试添加时间戳参数,但没有帮助 同样没有用。

这似乎是批处理版本中的一个问题,因为根据文档,我可以使作业执行唯一,并且作业可以使用新文件(每次文件都不同,第一次运行时文件不相同)。

最后,我不得不转为hack来强制为我解决以下问题:

[解决方案] 会在每次运行应用程序时强制以不同的方式命名作业。这样:

@Bean
public Job sampleJob() throws Exception {
   String jobName = "sampleJob" + System.currentTimeMillis();
   return jobBuilderFactory.get(jobName)
      .incrementer(new RunIdIncrementer())
      .start(step1()).on("COMPLETED").to(successFileArchiveStep())
      .from(step1()).on("*").to(failureFileArchiveStep())
      .end()
      .build();
}

答案 1 :(得分:0)

  

我尝试删除了增量器(新的RunIdIncrementer()),在这种情况下,它可以正常工作,但是我无法使用相同的参数重复执行。

根据设计,作业实例一旦完成就无法重新运行(如果尝试执行,则会抛出JobInstanceAlreadyCompleteException)。如果上一次执行失败,则可以重新运行同一实例,但是一旦完成,就无法再次运行它。此处以示例为例对此进行了详细说明:https://docs.spring.io/spring-batch/4.0.x/reference/html/domain.html#jobinstance

  

作业必须具有执行参数,而不是存储在数据库中的参数

     

该作业必须支持使用相同参数的多次执行。

您可以执行以下操作来继续使用RunIdIncrementer,就像现在一样,但是将日期设为 non-identifying 参数。这样,run.id参数将有助于标识您的作业实例(因此每次运行都会有一个新实例),但是date参数将不会有助于标识作业实例。未标识的作业参数应以“-”作为前缀(请参见javadoc of the DefaultJobParametersConverter)。

希望这会有所帮助。

答案 2 :(得分:0)

问题是getNexJobParameters如何工作。它接受作业的last(!)实例的最后一次执行的JobParameters,并将其作为输入到JobParameterIncrementer。这样,通常新实例将在某种意义上继承任意作业实例的参数。显然,这还将包括非识别参数。 您可以在命令行上显式覆盖旧参数值。