假设一个step中要执行一项读数据、然后处理数据,最后写数据的任务,如果数据非常大,需要很长的一段的时间才能处理完,此种情况下就可以创建多个线程来同时执行该任务,缩短任务的执行时间。但是要在读的任务上加 Synchronized 标识,保证同一个时刻只有一个线程在读,使每个线程读取的数据不一样。如果不加Synchronized,有可能两个线程在同时读数据,读的数据会有部分重叠,影响数据的处理。
在spring中已经定义了ThreadPoolTaskExecutor线程池,在step中只需要使用该线程池即可。
@Bean
public Job fileReaderJob(){
return jobBuilderFactory.get("fileReaderJob")
.start(chunkStep())
.build();
}
@Bean
public Step chunkStep(){
return stepBuilderFactory.get("chunkStep")
.chunk(3)
.reader(new FileItemReader()) /*在FileItemReader的reader方法中要加Synchronized*/
.writer(list -> list.forEach(System.out::println))
.allowStartIfComplete(true) //测试用,生产去掉
.taskExecutor(taskExecutor()) //启动线程池
.build();
}
/*创建一个线程池,定义线程池的参数*/
@Bean
public ThreadPoolTaskExecutor taskExecutor(){
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(corePoolSize);
threadPoolTaskExecutor.setMaxPoolSize(maxPoolSize);
threadPoolTaskExecutor.setQueueCapacity(queueCapacity);
threadPoolTaskExecutor.setKeepAliveSeconds(keepAliveSeconds);
return threadPoolTaskExecutor;
}