我想使用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 管理?
为您的 bean 注释添加名称,例如
@Bean(name="taskExecutor")
。这应该使您的 bean 可以在名称 taskExecutor 下使用。默认情况下,它注册一个名为 methodName 的 bean。请参阅此处参考Spring Bean
虽然 JavaBeans 规范使用
get
(或 is
)作为 getter 方法的属性名称前缀,但 Spring @Bean
方法不使用该“翻译”约定。你的执行器 bean 的名字实际上是 getAsyncExecutor
;将其重命名为taskExecutor
。
看来你的
Application
不是一个配置类。
将
@EnableAsync
放在具有
@SpringBootApplciation
或用 @Configuration
注释的类。