我目前正在设计一个Spring批处理应用程序,该应用程序从表中读取数据,转换数据,然后将其写入另一个表。但是,在开始读取源表之前,我需要为应用程序运行收集一些元数据(例如,阅读假日日历表以确定它是否是银行假日)。这个元数据在运行时将不再改变,因此它只需要在应用程序运行的开始时读取一次。如何才能做到这一点?用JobListener
?为此配置一个单独的Job
,然后通过ExecutionContext
将信息传递给“实际”作业?配置一个只执行一次的单独步骤?
发布于 2022-01-09 19:52:18
配置JobExecutionListener以获取所需信息,并将其存储在作业的ExecutionContext上。
您可以创建一个监听器类,该类可以扩展JobExecutionListenerSupport以仅覆盖beforeJob方法,也可以创建具有带有@BeforeJob注释的beforeJob方法的独立侦听器类。
在配置作业时,只需在添加任何步骤之前将自定义侦听器类的实例添加到JobBuilder配置中即可。
@Bean
public Job myJob() {
return this.jobBuilderFactory.get("myJob")
.listener(new MyListener())
.start(step1())
.next(step2())
.next(step3())
.build();
}
然后,您在作业的ExecutionContext中添加的任何内容都可以注入到任何其他配置好的处理器/阅读器/作家/步骤bean中,只要它们使用@JobScope或@StepScope进行注释:
@Bean
@JobScope
public ItemReader<MyItem> myItemReader(
@Value("#{jobExecutionContext['myDate']}") Date myDate) {
//...
}
组件类也同样工作。
@Component
@JobScope
static class MyProcessor implements ItemProcessor<ItemA, ItemB> {
private Date myDate;
public MyProcessor(
@Value("#{jobExecutionContext['myDate']}") Date myDate) {
this.myDate = myDate;
}
// ...
}
https://stackoverflow.com/questions/70631929
复制相似问题