Spring 批处理未拾取任务执行程序

Spring batch not picking task executor

提问人:Shivam Anand 提问时间:11/15/2023 最后编辑:M. DeinumShivam Anand 更新时间:11/16/2023 访问量:36

问:

这是我的春季批处理配置:

@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();
}

我仍然收到“未找到任务执行程序”。

java 多线程 spring-batch

评论

1赞 M. Deinum 11/15/2023
警告是关于不是你的.这些是不同的东西。它用于您的步骤,而不是用于启动器,这些是完全不同的东西。JobLauncherJob

答:

0赞 Harvey 11/16/2023 #1

我认为它与 WriterExecutor 有关,尝试使用上下文处理器调试 API,对我有用