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
解决方法
-
RabbitHealthIndicator
需要spring.rabbitmq
的配置,就给他:将spring.cloud.stream.binders.*.environment
里面的配置拿到spring.rabbitmq
中。 -
禁用
RabbitHealthIndicator
。上面提到的配置类上还有一个@ConditionalOnEnabledHealthIndicator("rabbit")
,意思就是:配置management.health.rabbit.enabled
为true的时候生效。禁用即可解决。management: health: rabbit: enabled: true
-
在localhost安装一个RabbitMQ(开玩笑的)
原文地址:https://www.cnblogs.com/macho8080/p/15110508.html
- HDUOJ---------Kia's Calculation
- HDUOJ----Good Numbers
- DP较为完整的知识
- HDUOJ----The Number Off of FFF
- HDUOJ-------Naive and Silly Muggles
- HDUOJ----A Computer Graphics Problem
- HDUOJ---(4708)Herding
- HDUOJ---(4708)Rotation Lock Puzzle
- HDUOJ---Hamming Distance(4712)
- HDUOJ-----Difference Between Primes
- HDUOJ----(4706)Children's Day
- poj-------Common Subsequence(poj 1458)
- poj----Maximum sum(poj 2479)
- HDUOJ---hello Kiki
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- python学生管理系统的实现
- 详解Android使用Handler造成内存泄露的分析及解决方法
- android使用flutter的ListView实现滚动列表的示例代码
- 实验7 3D机器人
- EasyValidate优雅地校验提交数据完整性
- 实验8 OpenGL太阳系动画
- Django实现列表页商品数据返回教程
- 实验9 OpenGL光照
- Python实现多线程下载脚本的示例代码
- Android自定义控件仿iOS滑块SwitchButton
- kotlin gson反序列化默认值失效深入讲解
- Android使用Volley实现上传文件功能
- 工作中使用jasmine遇到的一个html element和Component绑定属性失去同步的问题
- Android使用Volley框架定制PostUploadRequest上传文件
- Android实现横向滑动卡片效果