我有一个 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
或类似的东西来做到这一点?
您可以尝试进行以下修改:
@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
确保如果所有线程都忙并且队列已满,调用线程将运行该任务。它由调用线程处理而不是被拒绝。