在 Spring Batch 中如何在实际作业之前读取元数据

How do you read meta data before the actual job in Spring Batch

我目前正在设计一个 Spring 批处理应用程序,它从 table 中读取数据,转换数据,然后将其写入另一个 table。 但是,在我开始阅读源代码 table 之前,我需要为应用程序 运行 收集一些元数据(例如阅读假日日历 table 以确定它是否是银行假日) .此元数据在 运行 时间内不会再更改,因此只需在应用程序 运行 开始时读取一次。 如何实现?使用JobListener?为此配置一个单独的 Job,然后通过 ExecutionContext?配置一个只执行一次的单独步骤?

配置 JobExecutionListener 以获取您需要的信息并将其存储在作业的 ExecutionContext 中。

您可以创建一个监听器 class 扩展 JobExecutionListenerSupport to only override the beforeJob method or create a standalone Listener class with a beforeJob method annotated with @BeforeJob.

配置作业时,只需在添加任何步骤之前将自定义侦听器 class 的实例添加到您的 JobBuilder 配置中。

@Bean
public Job myJob() {
    return this.jobBuilderFactory.get("myJob")
                     .listener(new MyListener())
                     .start(step1())
                     .next(step2())
                     .next(step3())
                     .build();
}

您在 Job 的 ExecutionContext 中添加的任何内容都可以注入到任何其他 Processor/Reader/Writer/Step 配置的 bean 中,只要它们被 @JobScope 或 @StepScope 注释:

@Bean
@JobScope
public ItemReader<MyItem> myItemReader(
        @Value("#{jobExecutionContext['myDate']}") Date myDate) {
    //...
}

组件class也是一样的

@Component
@JobScope
static class MyProcessor implements ItemProcessor<ItemA, ItemB> {

    private Date myDate;

    public MyProcessor(
            @Value("#{jobExecutionContext['myDate']}") Date myDate) {
        this.myDate = myDate;
    }

// ...
}