spring-boot - 如何在 Spring Boot 中为现有 RabbitMQ 队列关闭自动队列声明?
问题描述
我们有许多 micore 服务。每个微服务声明并创建自己的队列,但有一个微服务监听其中一些队列。
App A => Creates its own queue A
App B => Listens to queue A
现在的问题是当我们修改 say 上的队列时App A
,例如添加死信队列或添加ttl
等,App B
失败例如这个错误:
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED
- inequivalent arg 'x-dead-letter-exchange' for queue 'queue-app-a' in vhost '/':
received none but current is the value 'direct-exchange' of type 'longstr', class-id=50, method-id=10)
现在这个特殊错误是因为在 A 上我们配置了死信队列,但在 B 中我们只是将代码保留为:
@Bean
public Queue queueAppA() {
return new Queue("queue-app-a");
}
有没有办法告诉 Spring 使用现有的可用队列而不是尝试声明它App B
?否则,我们必须让这些代码保持同步,这既痛苦又容易出错,因为开发人员甚至可能都不知道。
解决方案
通常,发送者对消费队列一无所知。您拥有的发送到队列的服务不必知道有关队列的任何信息(仅知道队列的名称)。
然后他们可以发送到队列名称,如果队列存在,则消息将降落在那里,如果它不存在,则消息将消失。
只有消费服务应该知道队列(它应该只由该服务定义)这样你就可以避免你遇到的问题。
推荐阅读
- css - 如何在html中的一行内对齐多个按钮?
- rabbitmq - 集群中的 RabbitMQ Shovel 插件
- reactjs - 我在使用 redux 获取本机反应数据时遇到错误
- android - 如何在 Android 上同时连接到 MOBILE 时检查 Wi-Fi 连接 (SSID)
- wpf - 根据 wpf 中的值启用/禁用列表视图内的按钮
- python - 为 django 2.1+ 适配 MultiHostMiddleware
- php - PHP 版本 7.2.13 中的文件未移动到文件夹
- c# - 无法将字符串转换为 system.Net.HttpContent
- php - 如何在 PHP 中将特殊时区的当前日期和时间转换为十进制(16,4)
- ms-access - 如何通过(无限)添加按钮在主窗体中制作系列子窗体?