【发布时间】:2019-03-14 21:56:11
【问题描述】:
我正在使用 Spring boot 2.0.5.RELEASE 并使用此运行批处理:
# prevent auto-start of batch jobs
spring:
batch:
job:
enabled: false
并使用控制器端点手动触发它(input 是从控制器收集的用户参数):
jobLauncher.run(job, new JobParametersBuilder()
.addDate("date", new Date())
.addJobParameters(new JobParameters(input)).toJobParameters());
这是我的批处理配置:
@Bean
public MongoItemReader<Document> reader() {
MongoItemReader<Document> reader = new MongoItemReader<>();
reader.setTemplate(mongoTemplate);
reader.setCollection(XML_PERSIST_COLLECTION);
reader.setQuery("{}");
Map<String, Sort.Direction> sorts = new HashMap<>(1);
sorts.put("status", Sort.Direction.ASC);
reader.setSort(sorts);
reader.setTargetType(Document.class);
return reader;
}
@Bean
@StepScope
public MyItemProcessor processor() {
return new MyItemProcessor();
}
@Bean
public MongoItemWriter<OutputDto> writer() {
MongoItemWriter<OutputDto> writer = new MongoItemWriter<>();
writer.setTemplate(mongoTemplate);
writer.setCollection(RESPONSE_COLLECTION);
return writer;
}
@Bean
public Step step() {
return stepBuilderFactory.get("step")
.<Document, OutputDto> chunk(1)
.reader(reader())
.processor(processor())
.writer(writer())
.allowStartIfComplete(true)
.build();
@Bean
public Job job(Step step) {
return jobBuilderFactory.get("job")
.incrementer(new RunIdIncrementer())
.flow(step)
.end()
.build();
}
和我的处理器:
public class MyItemProcessor implements ItemProcessor<Document, OutputDto> {
@Value("#{jobParameters['username']}")
private String username;
@Value("#{jobParameters['password']}")
private String password;
@Override
public OutputDto process(final Document document) throws Exception {
// implementation code
}
}
我使用@StepScope 作为处理器 来提取从我的控制器传递的作业参数。
问题: 一切都很好,只是批处理作业在应用程序启动后只会运行一次并且不会再次运行(它会运行,但我尝试将调试点保留在 processor 中,但它没有到达那里)。我已经添加了一个 timestamp 作业参数,以便可以再次运行批处理作业,但 processor 不会多次运行(当它应该运行时)。有任何想法吗?
【问题讨论】:
-
由于您添加了时间戳作为作业参数,因此应为每次运行创建一个新作业实例。您是否在作业存储库中看到每次运行都有一个新作业实例?如果是这种情况,我不确定在后续运行中如何调用读取器/写入器而不是处理器。
-
正在创建一个新实例,我也正在获取启动/停止日志,但后续运行不会调用处理器:(
-
我认为您的配置没有任何问题(除非我遗漏了一个小细节),但如果您分享一个最小的要点,我可以运行以重现该问题,我很乐意提供帮助。
-
@MahmoudBenHassine 非常感谢,现在已修复。我尝试将
@StepScope添加到reader()和writer()中,现在处理器正在按预期被调用:)
标签: java spring mongodb spring-boot spring-batch