Spring batch 如何将@Lazy之类的东西应用于Spring批处理?

Spring batch 如何将@Lazy之类的东西应用于Spring批处理?,spring-batch,Spring Batch,我有一个包含多个作业(作业a、作业B、作业C等)的Spring批处理项目。当我运行一个特定的作业a时,我得到了作业a的日志,它显示了作业B,C,。。。它们也是被创造出来的。是否有任何方法可以避免在启动作业时创建其他bean 我曾尝试使用@Lazy注释,但它似乎不起作用 @Configuration @EnableBatchProcessing public class BatchConfiguration { @Autowired public JobBuilderFactor

我有一个包含多个作业(作业a、作业B、作业C等)的Spring批处理项目。当我运行一个特定的作业a时,我得到了作业a的日志,它显示了作业B,C,。。。它们也是被创造出来的。是否有任何方法可以避免在启动作业时创建其他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;
    }
}
@配置
@启用批处理
公共类批处理配置{
@自动连线
公共建筑商建筑商工厂;
@自动连线
公共StepBuilderFactory StepBuilderFactory;
@自动连线
@限定符(“springDataSource”)
公共数据源springDataSource;
@自动连线
@限定符(“batchJobDataSource”)
公共数据源batchJobDataSource;
}
@配置
@PropertySource(“类路径:partner.properties”)
公共类B扩展了批处理配置{
@值(“${partnerId}”)
私有字符串partnerId;
@懒惰的
@豆子
公共作业进程B(JobCompletionNotificationListener侦听器){
返回jobBuilderFactory
.get(“ProcessB”)
.incrementer(新的RunIdIncrementer())
.listener(侦听器)
.start(ProcessStepB())
.build();
}
@懒惰的
@豆子
公共步骤(ProcessStepB(){
返回stepBuilderFactory
.get(“(进程步骤b”)
.chunk(1)
.reader(getPartner())
.processor(进程())
.writer(保存())
.build();
}
@懒惰的
@Bean(方法=”)
公共读取器getPartner(){
返回新读取器(batchJobDataSource,partnerId);
}
@懒惰的
@豆子
公共处理器进程(){
返回新处理器();
}
@懒惰的
@豆子
历史撰稿人历史撰稿人(){
返回新的HistoryWriter(batchJobDataSource);
}
@懒惰的
@豆子
UpdateWriter UpdateWriter(){
返回新的UpdateWriter(batchJobDataSource);
}
@懒惰的
@豆子
public CompositeItemWriter saveTransaction(){

列出这不应该是一个问题。但这里有一些想法可以尝试:

  • 使用Spring概要文件隔离作业bean
  • 如果您使用Spring Boot 2.2+,请尝试激活
  • 将每个作业打包到自己的jar中,这是最好的选择

如果急切地创建其他作业的bean,会出现什么问题?如果我的批次有多个作业(例如:20个作业,bean的数量大约为100个)。当我使用Spring Cloud Data Flow启动批处理中的特定作业时。它会执行java-jar并加载所有包含未用于该作业的bean的bean。我认为每启动一次作业都会影响加载所有bean的时间。谢谢你的建议。我将尝试第二个选项。但是,我不知道你的第一个解决方案。你能给我一些建议吗给我一些指南或文档。关于将每个作业打包到自己的jar中,这意味着如果我有100个作业(实际上,在我的案例中,这个数字可能更大)所以我需要100个jar?这让我混淆了spring云数据流中--spring.batch.job.names的用途。对于spring概要文件功能,请看这里:。您可以为每个作业定义一个概要文件,以仅加载该作业的bean。对于每个作业的jar打包模型,是的,您将拥有与作业一样多的jar。这实际上不是一个问题:每个作业将有自己的生命周期(如果您修复了作业中的一个bug,您不需要重新部署所有bug),日志将按设计分隔,bean将按设计分隔(就像您的实际问题一样),以及让一件事做一件事并把它做好的所有优点。使用lazy可能会受到影响。因为所有bean都不是第一次初始化的,但当应用程序启动时,会调用bean?我不知道是哪个部分负责(应用程序启动后,哪个称为bean作业?).然而,我很困惑,如果我不将我的阅读器、处理器和写入器定义为Bean,会发生什么?我的工作有什么问题吗?