Spring Batch-处理器在初次运行后未运行

时间:2018-10-10 04:20:06

标签: java spring mongodb spring-boot spring-batch

我正在使用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 并没有运行超过一次(应该时)。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

reader()writer()的范围是 singleton ,而processor()的范围是@StepScope-看来这就是writer()的原因是不是被调用。

我向读者和作家添加了@StepScope,现在一切都很好,尽管它并没有引起我的直觉-在2.0.5.RELEASE中应该没有它。