我是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来实现此工作:
我将不胜感激。 问候
答案 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。这样,通常新实例将在某种意义上继承任意作业实例的参数。显然,这还将包括非识别参数。 您可以在命令行上显式覆盖旧参数值。