zoukankan      html  css  js  c++  java
  • springcloud stream 报错 Rabbit health check failed

    问题现象

    在使用SpringCloud Stream集成RabbitMQ的时候报了这个错:

    2021-08-06 21:34:05.153  WARN 18660 --- [-172.28.165.129] o.s.b.a.amqp.RabbitHealthIndicator       : Rabbit health check failed
    org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused: connect
    

    一开始我被Connection refused: connect迷惑了,查了半天为啥连不上RabbitMQ。翻源码、debug发现连接的地址没错,看RabbitMQ控制台也有connection和channel,说明实际还是连上了。

    那为啥还报这个错呢?

    仔细一看抛异常的是RabbitHealthIndicator,原来是SpringBoot Actuator想要监控RabbitMQ的连接状态,但是连接被拒绝。

    我的配置文件如下:

    spring:
      cloud:
        stream:
          binders: # 在此处配置要绑定的rabbitmq的服务信息;
            defaultRabbit: # 表示定义的名称,用于于binding整合
              type: rabbit # 消息组件类型
              inheritEnvironment: false
              environment: # 设置rabbitmq的相关的环境配置
                spring:
                  rabbitmq:
                    host: 172.22.234.51
                    port: 5672
                    username: admin
                    password: 123
    

    原因

    就是因为我使用了spring.cloud.stream.binders.*.environment属性配置rabbitMQ的相关信息,但是没配置spring.rabbitmq。这就导致自动配置检测到类路径下有rabbit相关的类,就配置了rabbit相关的Bean。

    其中org.springframework.boot.actuate.amqp.RabbitHealthIndicator负责监控rabbit的连接状况,通过下面这个配置类自动配置。

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass(RabbitTemplate.class)
    @ConditionalOnBean(RabbitTemplate.class)
    @ConditionalOnEnabledHealthIndicator("rabbit")
    @AutoConfigureAfter(RabbitAutoConfiguration.class)
    public class RabbitHealthContributorAutoConfiguration
          extends CompositeHealthContributorConfiguration<RabbitHealthIndicator, RabbitTemplate> {
    
       @Bean
       @ConditionalOnMissingBean(name = { "rabbitHealthIndicator", "rabbitHealthContributor" })
       public HealthContributor rabbitHealthContributor(Map<String, RabbitTemplate> rabbitTemplates) {
          return createContributor(rabbitTemplates);
       }
    
    }
    

    但是没有检测到spring.rabbitmq相关的配置,就使用了默认的配置,尝试连接localhost:5672,然后就出现了org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused: connect

    问题的关键在于,spring.cloud.stream.binders.*.environment为每个binder创建了单独的上下文环境,跟application context是完全隔离的。所以,仅仅配置了spring.cloud.stream.binders.*.environment,使Actuator从application context中没有找到rabbitmq的配置。

    参考Spring Cloud Stream and RabbitMQ health check

    解决方法

    1. RabbitHealthIndicator需要spring.rabbitmq的配置,就给他:将spring.cloud.stream.binders.*.environment里面的配置拿到spring.rabbitmq中。

    2. 禁用RabbitHealthIndicator。上面提到的配置类上还有一个@ConditionalOnEnabledHealthIndicator("rabbit"),意思就是:配置management.health.rabbit.enabled为true的时候生效。禁用即可解决。

      management:
        health:
          rabbit:
            enabled: true
      
    3. 在localhost安装一个RabbitMQ(开玩笑的)

  • 相关阅读:
    Windows 科研软件推荐
    有关Python 包 (package) 的基本知识
    《Using Python to Access Web Data》Week4 Programs that Surf the Web 课堂笔记
    Coursera助学金申请模板
    《Using Databases with Python》 Week2 Basic Structured Query Language 课堂笔记
    Jupyter 解决单个变量输出问题
    解决 pandas 中打印 DataFrame 行列显示不全的问题
    《Using Python to Access Web Data》 Week3 Networks and Sockets 课堂笔记
    缓存击穿及解决方案
    jvm垃圾收集器
  • 原文地址:https://www.cnblogs.com/macho8080/p/15110508.html
Copyright © 2011-2022 走看看