首页 > 解决方案 > 使用分区器 Spring Batch 限制线程

问题描述

我的 Spring 批处理应用程序消耗了太多资源(+4 go Ram)。

当我查看 jvm 时,应用程序创建了 10 个线程。

如何在单线程中应用我的应用程序?任务执行器不起作用。

标签: springspring-batch

解决方案


您的应用创建了 10 个线程,但这些线程不一定是 Spring Batch 线程。根据您的配置,MyBatch-应该只创建一个带前缀的线程。

此外,您将任务执行器声明为 bean,但您没有在分区步骤上设置它。你partitionStep应该是这样的:

@Bean
public Step partitionStep() throws IOException {
   Step mainStep = stepBuilderFactory.get("mainStep")
        .<InOut, InOut>chunk(1)
        .reader(ResourceReader())
        .processor(processor())
        .writer(itemWriter())
        .build();

   return this.stepBuilderFactory.get("partitionStep")
        .step(mainStep) // instead of .partitioner(mainStep)
        .partitioner("mainStep", partitioner())
        .taskExecutor(taskExecutor())
        .build();
}

如何在单线程中应用我的应用程序?任务执行器不起作用。

在分区步骤上设置任务执行器后,您应该看到此步骤由您的ThreadPoolTaskExecutor. 但是,我没有看到将单个线程用于分区步骤的好处,因为这种设置的通常目标是并行处理分区(本地使用多个线程或远程使用多个工作 JVM)。

附带说明一下,最好使用 中的 Job 侦听器关闭任务执行器afterJob,但不要System.exit. 您需要让 JVM 正常关闭。

希望这可以帮助。


推荐阅读