共计 2758 个字符,预计需要花费 7 分钟才能阅读完成。
背景
今天将一个 SpringBoot 项目的配置参数从原有的.yml 文件迁移到 Apollo 后,启动报错
Bean method ‘rocketMQTemplate’ in ‘RocketMQAutoConfiguration’ not loaded because @ConditionalOnBean (types: org.apache.rocketmq.client.producer.DefaultMQProducer; SearchStrategy: all) did not find any beans of type org.apache.rocketmq.client.producer.DefaultMQProducer
花了两个小时才最终搞清楚,原因是缺少了配置项 spring.rocketmq.producer.group 从而导致无法成功创建 RocketMQAutoConfiguration 这个 Bean,从而导致一连串对此有依赖的 Bean 无法创建成功。
排查过程
启动的错误日志
2019-04-02 15:21:33.689 WARN 17516 — [main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization – cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘myServiceAImpl’: Unsatisfied dependency expressed through field ‘myServiceBImpl’; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘myServiceAImpl’: Unsatisfied dependency expressed through field ‘rocketMQTemplate’; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘org.apache.rocketmq.spring.starter.core.RocketMQTemplate’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
2019-04-02 15:21:33.692 INFO 17516 — [main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} closed
2019-04-02 15:21:33.693 INFO 17516 — [main] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService
2019-04-02 15:21:33.693 INFO 17516 — [main] f.a.ReferenceAnnotationBeanPostProcessor : class com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor was destroying!
2019-04-02 15:21:33.702 INFO 17516 — [main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with ‘debug’ enabled.
2019-04-02 15:21:33.842 ERROR 17516 — [main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Field rocketMQTemplate in net.yourpackage.myServiceBImpl required a bean of type ‘org.apache.rocketmq.spring.starter.core.RocketMQTemplate’ that could not be found.
– Bean method ‘rocketMQTemplate’ in ‘RocketMQAutoConfiguration’ not loaded because @ConditionalOnBean (types: org.apache.rocketmq.client.producer.DefaultMQProducer; SearchStrategy: all) did not find any beans of type org.apache.rocketmq.client.producer.DefaultMQProducer
Action:
Consider revisiting the conditions above or defining a bean of type ‘org.apache.rocketmq.spring.starter.core.RocketMQTemplate’ in your configuration.
问题原因
从上图中可以看到 RocketMQAutoConfiguration 中的 mqProducer 方法会根据配置参数来创建 DefaultMQProducer,其中有两个必要的参数
spring.rocketmq.nameServer
spring.rocketmq.producer.group
在重新检查了一遍配置文件后发现,的确是因为漏掉了 spring.rocketmq.producer.group,将其加上之后便可以成功启动项目了。