关于@EnableBatchProcessing注解

如果用java config的方式配置spring batch中的相关bean,则可能会遇到@EnableBatchProcessing这个注解。

 

这个注解的用法一般出现在配置文件的上方,如下所示:

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public FlatFileItemReader<CreditBill> flatFileItemReader(){
        ......
    }
    
    ......
 }

@EnableBatchProcessing

这个注解的作用,和spring 家庭中的@Enable* 系列注解功能很类似。顾名思义,就是让我们可以运行Spring Batch。

在配置类上打上这个注解,spring 会自动 帮我们生成一系列与spring batch 运行有关的bean,并交给spring容器管理,而当我们需要这些beans时,只需要用一个@autowired就可以实现注入了。

自动生成的bean及名称如下

JobRepository - bean name "jobRepository"

JobLauncher - bean name "jobLauncher"

JobRegistry - bean name "jobRegistry"

PlatformTransactionManager - bean name "transactionManager"

JobBuilderFactory - bean name "jobBuilders"

StepBuilderFactory - bean name "stepBuilders"

如果用过 .xml 文件配置过spring batch 的同学肯定知道,一个spring batch 要运行起来,需要配置 jobRepository、JobLauncher等,还有定义Job以及其相应的步骤,也需要大量的xml代码

如果用java config方式 ,并用上该注解,则会节省很多xml配置上的编写

 

@Configuration
@EnableBatchProcessing
public class BatchConfig02 {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    //相当于用 <batch:job> 标签来定义step
    @Bean
    public Job creditBillPersistJob(){
        return jobBuilderFactory.get("creditBillPersistJob")
                .start(creditBillPersistStep())
                .build();
    }
    
    //相当于用 <batch:step> 标签来定义step
    @Bean
    public Step creditBillPersistStep(){
        return stepBuilderFactory.get("creditBillPersistStep")
                .<CreditBill, CreditBill>chunk(2)
                .reader(flatFileItemReader())
                .processor(creditBillProcess02())
                .writer(creditBillDBWritter02())
                .build();
    }

    @Bean
    public FlatFileItemReader<CreditBill> flatFileItemReader(){
        FlatFileItemReader<CreditBill> reader = new FlatFileItemReader<>();
        Resource resource = new FileSystemResource("src\\main\\resources\\data\\ch02\\credit_bill_info_02.txt");
        reader.setResource(resource);
        BeanWrapperFieldSetMapper fieldSetMapper = new BeanWrapperFieldSetMapper();
        fieldSetMapper.setTargetType(CreditBill.class);
        DefaultLineMapper<CreditBill> lineMapper = new DefaultLineMapper<>();
        lineMapper.setFieldSetMapper(fieldSetMapper);
        DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
        tokenizer.setDelimiter(",");
        tokenizer.setNames("accountId", "name", "txnAmount", "txnDate", "address");
        lineMapper.setLineTokenizer(tokenizer);
        reader.setLineMapper(lineMapper);
        return reader;
    }

    @Bean
    public CreditBillProcess02 creditBillProcess02(){
        return new CreditBillProcess02();
    }

    @Bean
    public ItemWriter<CreditBill> creditBillDBWritter02(){
        return new CreditBillDBWritter02();
    }
}

在上面的示例中,因为我们用了 @EnableBatchProcessing 注解,所以我们可以直接注入 JobBuilderFactory 、StepBuilderFactory 对象,而这个对象,正是我们定义job、step所必须的。

 

当然,我们可以改变@EnableBatchProcessing 给我们的对象

比如,我们想让返回的jobRepository用上我们自定义的数据源,想让元数据的表前缀变成SPRING_BATCH_,而不是默认的BATCH_前缀,@EnableBatchProcessing 提供了让我们覆写的接口。

先看看用xml文件配置,如何自定义 jobRepository:

 

<batch:job-repository id="jobRepository" data-source="dataSource"
                          transaction-manager="transactionManager"
                          isolation-level-for-create="SERIALIZABLE"
                          table-prefix="SPRING_BATCH_"
                          max-varchar-length="1000" />

 

@EnableBatchProcessing 背后所调用的接口是BatchConfigurer。这个接口的代码如下:

 public interface BatchConfigurer {

	JobRepository getJobRepository() throws Exception;

	PlatformTransactionManager getTransactionManager() throws Exception;

	JobLauncher getJobLauncher() throws Exception;

	JobExplorer getJobExplorer() throws Exception;
}

我们可以自定义一个实现 BatchConfigurer 接口的类,重写相应的方法,在里面改变返回的对象。

但更常见的情况是,我们重写 DefaultBatchConfigurer 里面的若干方法来实现自身需求。

DefaultBatchConfigurer 是spring batch 提供的 BatchConfigurer 接口的默认实现类,即默认情况下,@EnableBatchProcessing注解所生成的对象,都是在 DefaultBatchConfigurer 中进行配置了的。

所以,我们可以在 DefaultBatchConfigurer 的基础上进行重写,这其实可以满足我们的大部分需求,如:

 

//只重写获取 transactionManager 的方法
@Bean
public BatchConfigurer batchConfigurer() {
    return new DefaultBatchConfigurer() {
        @Override
        public PlatformTransactionManager getTransactionManager() {
            return new MyTransactionManager();
        }
    };
}

 

以上便是关于 @EnableBatchProcessing 注解的解析。

 

参考:https://docs.spring.io/spring-batch/docs/4.2.x/reference/pdf/spring-batch-reference.pdf

 

 

 

 

 

 

 

 

 

 

发布了9 篇原创文章 · 获赞 2 · 访问量 5662
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章