gpt4 book ai didi

java - TaskExecutor 和 TaskScheduler 被 Spring 拾取为相同类型

转载 作者:行者123 更新时间:2023-12-01 08:29:16 25 4
gpt4 key购买 nike

我有以下配置:

@org.springframework.context.annotation.Configuration
@EnableJpaRepositories
@EnableAsync
@EnableScheduling
public class MyConfiguration {


@Bean
public TaskExecutor taskExecutor() {

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(50);
return executor;
}

@Bean
public TaskScheduler taskScheduler() {

ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
return scheduler;
}

}

然后我有一个类监听 Co​​ntextRefreshEvents,比如:

@Component
public class ScreenerScheduler implements ApplicationListener<ContextRefreshedEvent> {

@Inject
private TaskScheduler scheduler;

@Inject
private ApplicationContext context;

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
}

当我运行应用程序(网络)时,我得到:

Error creating bean with name 'screenerJobExecutor':
Injection of autowired dependencies failed;

nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire field:
private org.springframework.core.task.TaskExecutor example.workflow.ScreenerJobExecutor.executor;

nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type [org.springframework.core.task.TaskExecutor] is defined:
expected single matching bean but found 2: taskExecutor,taskScheduler

任何人都可以帮助弄清楚为什么 Spring 会看到 TaskScheuler 的两种可能类型?

最佳答案

这个@Bean方法

@Bean
public TaskScheduler taskScheduler() {

返回一个 ThreadPoolTask​​Scheduler 类型的对象,它是

public class ThreadPoolTaskScheduler extends ExecutorConfigurationSupport
implements TaskScheduler, SchedulingTaskExecutor {

所以它适合两个接口(interface),TaskSchedulerTaskExecutor(SchedulingTaskExecutor 的父类(super class)型)。

如果您尝试像堆栈跟踪所说的那样注入(inject) TaskExecutor 类型的字段

Could not autowire field: private org.springframework.core.task.TaskExecutor...

Spring 将无法选择哪一个。

仅当您尝试从其中提取 bean 的 ApplicationContext 已经初始化 bean 时才会发生这种情况,例如,在您的根上下文将注册 MyConfiguration< 的 Web 应用程序中 以及 servlet 上下文将声明您的 screenerJobExecutor bean 需要注入(inject) TaskExecutor 类型的 bean。

确实可以使用

@Qualifier(value = "taskExecutor")

修复这种特殊情况,因为 Spring 将使用 bean 名称而不是 bean 类型来满足注入(inject)目标。

关于java - TaskExecutor 和 TaskScheduler 被 Spring 拾取为相同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20508295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com