如果用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