關於@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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章