【发布时间】:2019-12-11 06:03:10
【问题描述】:
我正在学习 Spring Batch,并编写了简单的应用程序来玩它。 根据我的要求,我从单个 csv 文件中读取,进行一些转换并插入数据库。
我有以下配置:
@Bean
public Step step1(JdbcBatchItemWriter<Person> writer) {
return stepBuilderFactory.get("step1")
.<Person, Person>chunk(10)
.reader(reader())
.processor(processor())
.writer(writer)
.build();
}
@Bean
public Job importUserJob(JobCompletionNotificationListener listener, Step step1, Step step2) {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.listener(listener)
.listener(new JobExecutionListener() {
@Override
public void beforeJob(JobExecution jobExecution) {
System.out.println("!!!!!!!!!!!!!SECOND_LISTENER_BEFORE!!!!!!!!!!!!!!!!");
}
@Override
public void afterJob(JobExecution jobExecution) {
System.out.println("!!!!!!!!!!!!!SECOND_LISTENER_AFTER!!!!!!!!!!!!!!!!");
}
})
.flow(step1)
.next(step2)
.end()
.build();
}
public FlatFileItemReader reader() {
return new FlatFileItemReaderBuilder()
.name("csvPersonReader")
.resource(csvResource)
.delimited()
.names(new String[]{"firstName", "lastName"})
.fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
setTargetType(Person.class);
}})
.build();
}
现在我想使用 10 个线程执行该步骤。据我了解,我需要为此使用分区功能。我找到了几个关于它的例子,但它包含 XML 配置。我更喜欢使用java配置。
我怎样才能实现它?
附言
我尝试了以下方法:
@Bean
public Step step1(JdbcBatchItemWriter<Person> writer) {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(1);
TaskletStep step1 = stepBuilderFactory.get("step1")
.<Person, Person>chunk(10)
.reader(reader())
.processor(processor())
.writer(writer)
.taskExecutor(taskExecutor)
.build();
return step1;
}
但我的应用程序挂起。此外,它不是分区,只能在单台 PC 上运行
【问题讨论】:
标签: java spring spring-boot spring-batch