如何使用“ThreadPoolTaskExecutor”动态增加 Spring Batch 中的线程数量而不拒绝传入任务?

问题描述 投票:0回答:1

我有一个 Spring Batch 应用程序,它负责几十个使用 cron 调度运行的作业。

我遇到了一些问题,有些作业没有运行,我认为这是因为我缺少

TaskExecutor
,导致我的
JobLauncher
同步启动作业。

我已经包含了一个具有以下 bean 配置的

ThreadPoolTaskExecutor

@Bean
fun taskExecutor(): TaskExecutor {
  val executor = ThreadPoolTaskExecutor()

  executor.corePoolSize = 1
  executor.maxPoolSize = 4
  executor.keepAliveSeconds = 600
  executor.queueCapacity = 1

  return executor
}

我在这里注意到的是,一旦队列大于 1 个任务,就会创建线程,直到总共 4 个线程——之后,会抛出异常,并且我无法向队列添加更多任务(4 个是已处理并在队列中)。

我认为这是有道理的,因为我确实将队列容量设置为 1,但我期望的行为是“无限”数量的任务可以排队,最多运行 4 个线程,直到可用任务数量低于我的值。最大

有没有办法用

ThreadPoolTaskExecutor
或类似的东西来做到这一点?

java multithreading kotlin spring-batch
1个回答
0
投票

您可以尝试进行以下修改:

@Bean
fun taskExecutor(): TaskExecutor {
    val executor = ThreadPoolTaskExecutor()

    executor.corePoolSize = 1
    executor.maxPoolSize = 4
    executor.keepAliveSeconds = 600
    executor.queueCapacity = Integer.MAX_VALUE
    executor.setRejectedExecutionHandler(ThreadPoolExecutor.CallerRunsPolicy()) 

    return executor
}
  • Integer.MAX_VALUE
    确保队列可以容纳所需数量的任务,而不会遇到大小限制。

  • CallerRunsPolicy
    确保如果所有线程都忙并且队列已满,调用线程将运行该任务。它由调用线程处理而不是被拒绝。

© www.soinside.com 2019 - 2024. All rights reserved.