• 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(开玩笑的)

  • 相关阅读:
    pandas 数据类型研究(三)数据类型object与category
    kaggle比赛实践M5-baseline研读
    pd.melt详解--列转行
    kaggle比赛实践M5-数据集介绍
    kaggle比赛实践M5-比赛介绍
    txNLP 335-374
    信息,熵,联合熵,条件熵,互信息(信息增益),交叉熵,相对熵(KL散度)
    框架SpringMVC笔记系列 二 传值
    项目总结笔记系列 Social Hub KT Session1
    读书笔记系列之java性能优化权威指南 一 第一章
  • 原文地址:https://www.cnblogs.com/macho8080/p/15110508.html
Copyright © 2020-2023  润新知