提问人:Shivam Anand 提问时间:11/15/2023 最后编辑:M. DeinumShivam Anand 更新时间:11/16/2023 访问量:36
Spring 批处理未拾取任务执行程序
Spring batch not picking task executor
问:
这是我的春季批处理配置:
@RequiredArgsConstructor
@Configuration
@Slf4j
@EnableBatchProcessing
public class SpringBatchConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Autowired
@Lazy
private CRMTService crmtService;
@Bean
public TaskExecutor myTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(15);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("Batch-");
executor.initialize();
return executor;
}
@Bean
public Step step() {
return stepBuilderFactory.get("step")
.<String, String>chunk(10)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.taskExecutor(myTaskExecutor())
.build();
}
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.start(step())
.build();
}
@Bean
@StepScope
public ItemReader<String> itemReader() {
List<String> list = crmtService.getVertrags();
return new IteratorItemReader<>(list != null ? list.iterator() : Collections.emptyIterator());
}
@Bean
@StepScope
public ItemProcessor<String, String> itemProcessor() {
return item -> {
//Logic -> This calls a method in service class. In that method I am calling an API for each string and saving the response to mongodb.
return item;
};
}
@Bean
@StepScope
public ItemWriter<String> itemWriter() {
return items -> {
//If we plan to log do anything in future
};
}
}
Jdk 版本 11
Spring Boot 版本 2.6.3
我在我的服务类中触发了这个春季批次。
当我不使用任务执行器时,我能够在我的 mongodb 中获取所有产品 (214) [使用单线程,我能够获得所有产品,但显然这需要时间]。当我使用任务执行器时,我错过了 1 或 2 个产品 (212/213)。
此外,还有 2 个有趣的观察结果:
当 spring 批处理被触发时,这些是我在控制台中获得的日志:
WARN [] 9758 --- [onPool-worker-1] o.s.b.c.c.a.DefaultBatchConfigurer : No datasource was provided...using a Map based JobRepository
WARN [] 9758 --- [onPool-worker-1] o.s.b.c.c.a.DefaultBatchConfigurer : No transaction manager was provided, using a ResourcelessTransactionManager
INFO [] 9758 --- [onPool-worker-1] o.s.b.c.l.support.SimpleJobLauncher : **No TaskExecutor has been set, defaulting to synchronous executor**.
即使我已经在步骤 Bean 中设置了任务执行器。我收到此消息。
当 spring 批处理实际启动时,正在运行的线程来自 myTaskExecutor“,因为在控制台中我可以看到线程的名称以”Batch“开头,这是我在 spring batch 配置类中添加的前缀。
[ Batch-1] c.t.openapi.crmt.conf.SpringBatchConfig : Processing 123
[ Batch-3] c.t.openapi.crmt.conf.SpringBatchConfig : Processing 456
[ Batch-2] c.t.openapi.crmt.conf.SpringBatchConfig : Processing 789
问题 1:为什么即使我明确定义了任务执行器,也没有找到它?
问题 2:如果没有选择,那么为什么 spring batch 中的线程以“Batch-”开头
即使我使用它而不是任务执行器:
@Bean
public Step step() {
return stepBuilderFactory.get("step")
.<VertragsListe, VertragsListe>chunk(10)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.taskExecutor(new SimpleAsyncTaskExecutor())
.build();
}
我仍然收到“未找到任务执行程序”。
答:
0赞
Harvey
11/16/2023
#1
我认为它与 WriterExecutor 有关,尝试使用上下文处理器调试 API,对我有用
评论
JobLauncher
Job