Spring Boot 3.2 启用虚拟线程后 ThreadPoolTaskScheduler 报错

Spring Boot 虚拟线程 About 2,379 words

错误信息

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method rateLimiter in z.note.lite.web.interceptor.RateLimiterConfig required a bean of type 'org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler' in your configuration.

原始配置

@Configuration(proxyBeanMethods = false)
@EnableScheduling
public class TaskConfig {

    @Bean
    @ConditionalOnBean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler(ThreadPoolTaskScheduler threadPoolTaskScheduler) {
        return threadPoolTaskScheduler;
    }

}

原因

开启虚拟线程后,Spring Boot 3.2自动注入的Bean,根据条件注入了SimpleAsyncTaskScheduler,没有注入ThreadPoolTaskScheduler

替代方案

在开启了虚拟线程后,可以选择注入TaskScheduler

@Bean
public RateLimiter rateLimiter(TaskScheduler taskScheduler) {
    return new JdkRateLimiter(taskScheduler, rateLimiterProperties.getDuration(), rateLimiterProperties.getCount());
}

源码

class TaskSchedulingConfigurations {

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnBean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
    @ConditionalOnMissingBean({ TaskScheduler.class, ScheduledExecutorService.class })
    @SuppressWarnings("removal")
    static class TaskSchedulerConfiguration {

        @Bean(name = "taskScheduler")
        @ConditionalOnThreading(Threading.VIRTUAL)
        SimpleAsyncTaskScheduler taskSchedulerVirtualThreads(SimpleAsyncTaskSchedulerBuilder builder) {
            return builder.build();
        }

        @Bean
        @ConditionalOnThreading(Threading.PLATFORM)
        ThreadPoolTaskScheduler taskScheduler(TaskSchedulerBuilder taskSchedulerBuilder,
                ObjectProvider<ThreadPoolTaskSchedulerBuilder> threadPoolTaskSchedulerBuilderProvider) {
            ThreadPoolTaskSchedulerBuilder threadPoolTaskSchedulerBuilder = threadPoolTaskSchedulerBuilderProvider
                .getIfUnique();
            if (threadPoolTaskSchedulerBuilder != null) {
                return threadPoolTaskSchedulerBuilder.build();
            }
            return taskSchedulerBuilder.build();
        }

    }

}
Views: 820 · Posted: 2024-03-19

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓


Today On History
Browsing Refresh