Spring batch Spring批处理:使用不同的参数执行相同的作业

Spring batch Spring批处理:使用不同的参数执行相同的作业,spring-batch,Spring Batch,我是sprint的新手,我找不到问题的答案 我正在尝试使用SpringBoot和SpringBatch实现一个作业。我的作业需要一个参数,因此我执行的应用程序如下: java-jar-Dspring.profiles.active=gus /应用程序/botbit批处理/botbit-batch-1.0.0.jar --spring.batch.job.names=persistCustomerSuccessMetricsdate=2015-12-13 粗体,是我需要的参数 我第一次执行应用程序

我是sprint的新手,我找不到问题的答案

我正在尝试使用SpringBoot和SpringBatch实现一个作业。我的作业需要一个参数,因此我执行的应用程序如下:

java-jar-Dspring.profiles.active=gus /应用程序/botbit批处理/botbit-batch-1.0.0.jar --spring.batch.job.names=persistCustomerSuccessMetricsdate=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();
}
@Bean
@工作范围
公共CustomerSuccessMetricsReader CustomerSuccessMetricsReader(@Value(“#{jobParameters[date]}”)字符串日期){
返回新CustomerSuccessMetricsReader(storeStatisticsUrl、restTemplate、日期);
}
@豆子
公共客户SuccessMetricsProcessor客户SuccessMetricsProcessor(){
返回新CustomerSuccessMetricsProcessor();
}
@豆子
公共作业persistCustomerSuccessMetrics(步骤persistCustomerSuccessMetrics步骤1){
返回jobBuilderFactory.get(“persistCustomerSuccessMetrics”).incrementer(新的runidCrementer())
.listener(新CustomerSuccessMetricsCompletionListener()).flow(persistCustomerSuccessMetricsStep1.end().build();
}
@豆子
公共步骤persistCustomerSuccessMetricsStep1(){
返回stepBuilderFactory。
获取(“persistCustomerSuccessMetricsStep1”)。
块(10)。
读卡器(customerSuccessMetricsReader(null))。
处理器(customerSuccessMetricsProcessor())。
//编写器(customerSuccessMetricsWriter)。
build();
}
我已尝试删除递增程序(new RunIdIncrementer()) 在这种情况下,它可以正常工作,但我无法使用相同的参数重复执行

因此,我需要使用以下RQ来执行此工作:

  • 作业必须采用执行参数,而不是数据库中存储的参数
  • 作业必须支持同一参数的多个执行
我将感谢任何帮助。 问候

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

按照设计,作业实例完成后不可能重新运行(如果尝试执行此操作,将引发
JobInstanceAlreadyCompleteException
)。如果上次执行失败,可以重新运行同一实例,但一旦完成,就不能再次运行。下面用一个例子详细说明这一点:

作业必须采用执行参数,而不是数据库中存储的参数

作业必须支持同一参数的多个执行

您现在可以继续使用
RunIdIncrementer
,但将日期设为非识别参数。这样,
run.id
参数将有助于标识作业实例(因此每次运行时都会有一个新实例),但
date
参数将不会有助于标识作业实例。非识别作业参数应以“-”(请参阅)作为前缀

希望这有帮助

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

按照设计,作业实例完成后不可能重新运行(如果尝试执行此操作,将引发
JobInstanceAlreadyCompleteException
)。如果上次执行失败,可以重新运行同一实例,但一旦完成,就不能再次运行。下面用一个例子详细说明这一点:

作业必须采用执行参数,而不是数据库中存储的参数

作业必须支持同一参数的多个执行

您现在可以继续使用
RunIdIncrementer
,但将日期设为非识别参数。这样,
run.id
参数将有助于标识作业实例(因此每次运行时都会有一个新实例),但
date
参数将不会有助于标识作业实例。非识别作业参数应以“-”(请参阅)作为前缀


希望这能有所帮助。

[Background]我也有同样的问题,我的作业只有一个参数,我在命令行中传递如下:

$java-jar./target/[java可执行jar].jar文件=[file path]

我注意到,在一个全新的spring批处理元数据库上,这是第一次工作正常,之后如果我使用不同的文件运行,spring批处理将使用存储在批处理存储库元数据库中的文件路径

我尝试了上述所有建议的解决方案,但没有一个像上面所说的那样有效。我使用了“.incrementer(new RunIdIncrementer())”,它无法使作业执行唯一。我还尝试将文件参数作为非标识参数传递,如下所示:

$java-jar./target/[java可执行jar].jar--file=[file path]

我还尝试添加一个timestamp参数,但没有任何帮助 而且它也不起作用

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

最后,我不得不回复到一个黑客来强迫我解决这个问题,如下所示:

[解决方案]每次运行应用程序时,强制以不同的方式命名作业。方法如下:

@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();
}

[背景]我没有