【问题标题】:Spring Batch - Processor not running after initial runSpring Batch - 初始运行后处理器未运行
【发布时间】: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


【解决方案1】:

reader()writer()singleton 范围,而 processor()@StepScope - 所以看起来这就是为什么 writer() 没有调用。

我向读者和作者添加了@StepScope,现在一切正常,尽管它并没有让我觉得本能 - 在 2.0.5.RELEASE 中没有它应该可以工作。

【讨论】:

    猜你喜欢
    • 2016-12-21
    • 2012-09-27
    • 2020-02-24
    • 2016-10-23
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    相关资源
    最近更新 更多