Spring batch Spring批处理:使用不同的参数执行相同的作业
我是sprint的新手,我找不到问题的答案 我正在尝试使用SpringBoot和SpringBatch实现一个作业。我的作业需要一个参数,因此我执行的应用程序如下: java-jar-Dspring.profiles.active=gus /应用程序/botbit批处理/botbit-batch-1.0.0.jar --spring.batch.job.names=persistCustomerSuccessMetricsdate=2015-12-13 粗体,是我需要的参数 我第一次执行应用程序,但在以后的执行中,我的作业总是使用我在第一次执行中传递的参数 日志显示: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 粗体,是我需要的参数 我第一次执行应用程序
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来执行此工作:
- 作业必须采用执行参数,而不是数据库中存储的参数
- 作业必须支持同一参数的多个执行李>
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();
}
[背景]我没有