【发布时间】:2023-02-08 01:58:32
【问题描述】:
我有一个 AsyncItemProcessor,我想与以下配置并行运行。但是,处理不是并行发生的。
@Configuration
@EnableBatchProcessing
@EnableAsync
public class JobConfig {
@Autowired
private JobBuilderFactory jobBuilder;
@Autowired
private StepBuilderFactory stepBuilder;
@Autowired
@Qualifier("writer")
private ItemWriter writer;
@Bean
@JobScope
public ItemProcessor itemProcessor() {
ItemProcessor itemProcessor = new ItemProcessor();
return itemProcessor;
}
@Bean
@JobScope
public AsyncItemProcessor asyncItemProcessor() throws IOException {
AsyncItemProcessor asyncItemProcessor = new AsyncItemProcessor();
asyncItemProcessor.setDelegate(itemProcessor());
asyncItemProcessor.setTaskExecutor(getAsyncExecutor());
asyncItemProcessor.afterPropertiesSet();
return asyncItemProcessor;
}
@Bean(name = "asyncExecutor")
public TaskExecutor getAsyncExecutor() {
SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor() {
@Override
protected void doExecute(Runnable task) {
final JobExecution jobExecution = JobSynchronizationManager.getContext().getJobExecution();
super.doExecute(() -> {
JobSynchronizationManager.register(jobExecution);
try {
task.run();
} finally {
JobSynchronizationManager.close();
}
});
}
};
simpleAsyncTaskExecutor.setThreadNamePrefix("processing 1-");
simpleAsyncTaskExecutor.setConcurrencyLimit(100);
return simpleAsyncTaskExecutor;
}
@Bean
@JobScope
public AsyncItemWriter asyncItemWriter() throws IOException {
AsyncItemWriter asyncItemWriter = new AsyncItemWriter<>();
asyncItemWriter.setDelegate(writer);
asyncItemWriter.afterPropertiesSet();
return asyncItemWriter;
}
@Bean
public Step simpleFileStep() throws IOException {
return stepBuilder.get("simpleFileStep").chunk(100).reader(fileReader).processor(asyncItemProcessor())
.writer(asyncItemWriter()).taskExecutor(getAsyncExecutor()).build();
}
}
在这种情况下,我想并行处理包含 1000 条记录的文件,但一次只处理和写入 100 个项目。 如果配置有问题,请告诉我。
【问题讨论】:
-
我添加了你的问题的答案。我仍然很想知道覆盖
SimpleAsyncTaskExecutor#doExecute并用JobSynchronizationManager.register和JobSynchronizationManager.close包装任务执行的目的。
标签: spring spring-batch spring-batch-tasklet