Spring Boot中无法使用@Async

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

我想使用spring boot的异步机制,这是我的代码。

@Slf4j
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

    private static final int MAX_POOL_SIZE = 50;

    private static final int CORE_POOL_SIZE = 20;

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setBeanName("taskExecutor");
        taskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
        taskExecutor.setCorePoolSize(CORE_POOL_SIZE);
        taskExecutor.setThreadNamePrefix("async-task-thread-pool");
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        taskExecutor.setAwaitTerminationSeconds(60 * 10);
        taskExecutor.setRejectedExecutionHandler(
            (r, executor) -> log.warn("current thread pool is full, reject to invoke."));
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (ex, method, params) ->
        {
            log.error("invoke async method occurs error. method: {}, params: {}",
                method.getName(), JSON.toJSONString(params), ex);
            throw new RuntimeException();
        };
    }

}

我在另一个类的方法上添加了 @Async 注释。

@Override
public Future<Result> getResult(String name); 

但是当我调用

getResult()
方法时,它会报告
No bean named 'taskExecutor' available: No matching Executor bean found for qualifier 'taskExecutor' - neither qualifier match nor bean name match!

然后我找到这个页面:https://www.baeldung.com/spring-async。我遵循此页面的指南 - 删除

@EnableAsync
上的
Application.class
注释并添加到
AsyncConfig.class
。但仍然收到相同的错误消息。看来
setBeanName()
方法不起作用。难道我的用法错了?

顺便说一句,我读过

EnableAsync
的api文档,它写道

注意:在上面的示例中,{@code ThreadPoolTaskExecutor} 不是完全托管的 Spring bean。将 {@code @Bean} 注解添加到 {@code getAsyncExecutor()} 方法

如果你想要一个完全托管的bean。在这种情况下,就不再需要 手动调用 {@code executor.initialize()} 方法,因为它将被调用 bean 初始化时自动。

not a fully managed Spring bean
是什么意思? bean 的哪一部分不由 Spring 管理?

java spring spring-boot asynchronous
3个回答
0
投票

为您的 bean 注释添加名称,例如

@Bean(name="taskExecutor")
。这应该使您的 bean 可以在名称 taskExecutor 下使用。默认情况下,它注册一个名为 methodName 的 bean。请参阅此处参考Spring Bean


0
投票

虽然 JavaBeans 规范使用

get
(或
is
)作为 getter 方法的属性名称前缀,但 Spring
@Bean
方法不使用该“翻译”约定。你的执行器 bean 的名字实际上是
getAsyncExecutor
;将其重命名为
taskExecutor


0
投票

看来你的

Application
不是一个配置类。

@EnableAsync
放在具有
@SpringBootApplciation
或用
@Configuration
注释的类。

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