RabbitMQ用户能否查询到同一队列/交换机的其他连接监听者信息?
RabbitMQ 资源关联信息查询问题解答
关于获取同一资源的其他连接方信息
- AMQP 原生协议没有直接提供查询同队列/交换机其他连接用户、节点信息的能力,你需要借助RabbitMQ自带的HTTP管理API实现该需求:
- 调用
/api/queues/{vhost}/{队列名}接口可以拿到指定队列的所有消费者详情,包括连接所属用户名、客户端IP、所在RabbitMQ节点等信息 - 调用
/api/exchanges/{vhost}/{交换机名}/bindings接口可以获取该交换机下所有的绑定关系数据
- 调用
- 注意调用管理API的账号需要分配
management角色权限,默认的guest账号仅支持本地访问管理接口,生产环境需要单独配置对应权限。
关于查询Direct交换机所有监听者的routing key
- 仅通过Spring AMQP客户端无法直接拿到该信息,你可以选择两种方案实现:
- 调用上述的交换机绑定关系查询接口,返回结果中会包含每一条绑定对应的routing key,再关联队列的消费者信息即可映射出所有监听者对应的routing key列表
- 如果你有高频查询的需求,建议自行维护绑定关系注册中心:所有消费者启动完成绑定逻辑后,将自身节点信息、监听的routing key上报到公共存储(比如Redis、配置中心),业务侧直接查询存储即可,性能远高于调用管理API。
示例:Spring Boot 调用RabbitMQ管理API获取绑定关系
// 注入RestTemplate,提前配置好管理端的账号密码 Basic Auth @Autowired private RestTemplate restTemplate; public List<Map> getDirectExchangeBindings(String vhost, String exchangeName) throws UnsupportedEncodingException { // vhost如果是默认的/需要转码为%2F String encodedVhost = URLEncoder.encode(vhost, StandardCharsets.UTF_8); String url = String.format("http://你的RabbitMQ地址:15672/api/exchanges/%s/%s/bindings", encodedVhost, exchangeName); // 配置Basic Auth请求头 HttpHeaders headers = new HttpHeaders(); headers.setBasicAuth("管理账号", "管理密码"); HttpEntity<Void> request = new HttpEntity<>(headers); ResponseEntity<List<Map>> response = restTemplate.exchange(url, HttpMethod.GET, request, new ParameterizedTypeReference<List<Map>>() {}); return response.getBody(); }
内容的提问来源于stack exchange,提问作者Peter Kronenberg
相关产品推荐
相关产品推荐

