【发布时间】:2020-02-22 05:01:53
【问题描述】:
我有一个包含多个作业(作业 A、作业 B、作业 C、...)的 Spring Batch 项目。当我运行特定的作业 A 时,我得到作业 A 的日志,显示作业 B、C、...的所有 bean 也已创建。有什么办法可以避免在作业 A 启动时创建其他 bean。
我尝试使用@Lazy 注释,但它似乎不起作用。
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
@Qualifier("springDataSource")
public DataSource springDataSource;
@Autowired
@Qualifier("batchJobDataSource")
public DataSource batchJobDataSource;
}
@Configuration
@PropertySource("classpath:partner.properties")
public class B extends BatchConfiguration {
@Value("${partnerId}")
private String partnerId;
@Lazy
@Bean
public Job ProcessB(JobCompletionNotificationListener listener) {
return jobBuilderFactory
.get("ProcessB")
.incrementer(new RunIdIncrementer())
.listener(listener)
.start(ProcessStepB())
.build();
}
@Lazy
@Bean
public Step (ProcessStepB() {
return stepBuilderFactory
.get("(ProcessStepB")
.<PartnerDTO, PartnerDTO> chunk(1)
.reader(getPartner())
.processor(process())
.writer(save())
.build();
}
@Lazy
@Bean(destroyMethod = "")
public Reader getPartner() {
return new Reader(batchJobDataSource,partnerId);
}
@Lazy
@Bean
public Processor process() {
return new Processor();
}
@Lazy
@Bean
HistoryWriter historyWriter() {
return new HistoryWriter(batchJobDataSource);
}
@Lazy
@Bean
UpdateWriter updateWriter() {
return new UpdateWriter(batchJobDataSource);
}
@Lazy
@Bean
public CompositeItemWriter<PartnerDTO> saveTransaction() {
List<ItemWriter<? super PartnerDTO>> delegates = new ArrayList<>();
delegates.add(updateWriter());
delegates.add(historyWriter());
CompositeItemWriter<PartnerDTO> itemWriter = new CompositeItemWriter<>();
itemWriter.setDelegates(delegates);
return itemWriter;
}
}
我还将@Lazy 放在@Configuration 上,但它也可以工作。
【问题讨论】:
-
其他job的bean都被急切创建有什么问题?
-
如果我的 Batch 有多个作业(例如:20 个作业,bean 的数量约为 100)。当我使用 Spring Cloud Data Flow 在我的 Batch 中开始特定工作时。它执行 java - jar 并加载所有 bean,包括不用于该作业的 bean。而且我认为这会影响每 1 个工作启动加载所有 bean 的时间。
标签: spring-batch