前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【问题篇】Parameter 0 of method springAsyncExecutor in *.* equired a single bean, but 2 were found

【问题篇】Parameter 0 of method springAsyncExecutor in *.* equired a single bean, but 2 were found

作者头像
小z666
发布2024-06-21 17:36:54
870
发布2024-06-21 17:36:54
举报
文章被收录于专栏:java

互相学习交流

最近遇到一个小问题,再次记录一下,以便于后面遇到了可以回顾起来。 背景:在一个springboot项目上,使用了boot自带的定时任务(Scheduled),并且整合了activiti工作流,并且在项目中自己注册了线程池的bean。


项目现状:
  • 1、开启了springboot自带的定时任务
  • 2、在项目中配置了自己的线程池(注意:我此处没有使用的juc包下的ThreadPoolExecutor,而是springboot包装后的ThreadPoolTaskExecutor,后面的代码描述都是针对此情况。)
  • 3、 项目中整合了activiti

针对这种情况下启动项目,会发生什么呢?

出现情况:
  • 1、情况
  • 2、情况

Error creating bean with name 'springAsyncExecutor' defined in class path resource [org/activiti/spring/boot/ProcessEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'springAsyncExecutor' parameter 0;nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.core.task.TaskExecutor' available: expected single matching bean but found 2: taskExecutor,taskScheduler (ps:太长,用文本表示)

结果显然报错了。

针对报错:

  1. 截图意思是AbstractProcessEngineAutoConfiguration这类的bean注册时,需要一个TaskExecutor类型的单例bean的参数,但是却发现了两个,不知道使用哪一个。
  2. 文本意思是创建ProcessEngineAutoConfiguration这个bean时发生错误,他的一个参数bean创建也失败了,原因和上面一样,他的参数springAsyncExecutor也需要一个TaskExecutor类型的单例bean的参数,但是却发现了两个,不知道使用哪一个。
  3. 出现上面报错其实就是因为TaskExecutor的bean注入出现了多个导致activiti注册自己的bean报错。

我们点进这些类看一下。

针对情况1:

发现就是这个TaskExecutor参数,为什么会出现两个呢,我们再一起看一下。找到TaskSchedulingAutoConfiguration类。

当我们使用@EnableScheduling注解时,同时会向spring注册internalScheduledAnnotationProcessor这个处理器(已经测试过),当满足这个情况,存在@ConditionalOnBean注解,他就会向spring注册一个ThreadPoolTaskScheduler的bean,而这个bean就是一个TaskExecutor。

意味着,当开启定时任务后,spring容器中就已经存在一个TaskExecutor类型的bean了。

再然后我们配置的线程池注册的也同样是一个TaskExecutor类型的bean。

而activiti的AbstractProcessEngineAutoConfiguration类不知道需要哪一个bean,因此报错,而我们也无法帮助他指定,只得修改我们的配置类。

针对情况2:

打开ProcessEngineAutoConfiguration类

可以看到和上面一样的情况,都是无法确定唯一的TaskExecutor类型的bean。

解决方式:

通过加上@Primary注解可以解决,我们来指定以这个bean为主。

我们再重启项目打断点试一下。

针对情况1:

根据此处的参数可以看出AbstractProcessEngineAutoConfiguration使用的正是我们配置类注册进去的bean。

针对情况2:

可以看到ProcessEngineAutoConfiguration也是使用的我们配置类注册进去的bean。

结果:项目启动成功。

我们再实验一下,当我们不自定义线程池时。我们找到这个类TaskExecutionAutoConfiguration

可以看到他注册了两个bean,一个是预先包装ThreadPoolTaskExecutor的参数bean,一个是生成一个ThreadPoolTaskExecutorbean,启动项目时情况如下:

可以看到activiti正常情况下使用的正是springboot自动装配产生的ThreadPoolTaskExecutorBean。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目现状:
  • 出现情况:
    • 针对情况1:
      • 针对情况2:
      • 解决方式:
        • 针对情况1:
          • 针对情况2:
          相关产品与服务
          腾讯云服务器利旧
          云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档