我正在使用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
作为处理器来提取从我的控制器传递来的作业参数。
答案 0 :(得分:0)
reader()
和writer()
的范围是 singleton ,而processor()
的范围是@StepScope
-看来这就是writer()
的原因是不是被调用。
我向读者和作家添加了@StepScope
,现在一切都很好,尽管它并没有引起我的直觉-在2.0.5.RELEASE中应该没有它。