本次介绍AsyncItermProcessor和AsyncItemWriter
在很多场景中,process要处理大量的计算对比工作,计算对比可能还涉及大量的数据库读写工作。要是能将process单独多线程处理,那将会将性能提升很大一截,甚至是指数级的提升。
spring-batch提供了相应的处理方案。使用AsyncItermProcessor和AsyncItemWriter,一般需要组合使用,才能有效提升效率。
process代码
@StepScope
@Bean("userProcess")
public ItemProcessor<User, User> userProcess() {
ItemProcessor<User, User> itemProcessor = user -> {
//数据处理
return user;
};
return itemProcessor;
}
@StepScope
@Bean("asyncUserProcess")
public AsyncItemProcessor<User, User> asyncUserProcess(){
AsyncItemProcessor<User, User> processor = new AsyncItemProcessor<>();
processor.setDelegate(userProcess());
processor.setTaskExecutor(new SimpleAsyncTaskExecutor());
return processor;
}
writer代码
@Bean("userWriter")
public JdbcBatchItemWriter<User> userWriter() {
JdbcBatchItemWriter<User> writer = new JdbcBatchItemWriter<>();
//设置数据源
writer.setDataSource(dataSource);
//设置sql
writer.setSql("insert into user (user_id,user_name) values (:userId,:userName)");
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
return writer;
}
@Bean("asyncUserWriter")
public AsyncItemWriter<User> asyncUserWriter(){
AsyncItemWriter<User> writer = new AsyncItemWriter<>();
writer.setDelegate(this.userWriter());
return writer;
}
step和job代码
@Autowired
@Qualifier("asyncUserWriter")
AsyncItemWriter<User> asyncUserWriter;
@Autowired
@Qualifier("asyncUserProcess")
AsyncItemProcessor<User, User> asyncUserProcess;
@Bean
public Job userJob() {
return jobBuilderFactory.get("userJob")
.start(userStep())
.build();
}
@StepScope
@Bean
public Step userStep() {
return stepBuilderFactory.get("userStep")
.<User, Future<User>>chunk(2)
.reader(userReader)
.processor(asyncUserProcess)
.writer(asyncUserWriter)
.build();
}