我正在尝试在一个模型中设置RabbitMQ,其中只有一个 生产环境 者和一个消费者,并且 生产环境 者发送的消息仅在消费者连接时才传递给消费者,但如果消费者不存在则丢弃 .
基本上我希望队列在没有消费者连接时删除它收到的所有消息 .
另一个约束是必须在RabbitMQ服务器端声明队列,并且不能由使用者或 生产环境 者显式创建 .
那可能吗?
我看了几件事,但我似乎无法使其发挥作用:
-
持久与非持久不起作用,因为它仅在代理重新启动时有用 . 我需要相同的效果,但在连接上 .
在队列上 -
设置
auto_delete
为true意味着我的客户端永远不能再次连接到此队列 . -
x-message-ttl
和max-length
即使连接了消费者,也可能丢失消息 . -
我've looked at topic exchanges, but as far as I can tell, these only affect the routing of messages between the exchange and the queue based on the message content, and can' t考虑队列是否已连接消费者 .
我正在寻找的效果类似于断开连接 auto_delete
,连接时 auto_create
. 在rabbitmq中是否有一种机制可以让我这样做?
3 回答
经过一番研究后,我发现我的问题中有一个关于
x-message-ttl
的假设是错误的 . 我忽略了RabbitMQ文档中的一句话:事实证明,最简单的解决方案是在我的队列中将
x-message-ttl
设置为0
.你不能直接这样做,但有一种机制并不是很难实现 .
您必须启用Event Exchange插件 . 这是您的服务器应用程序可以连接的交换,并将接收RabbitMQ的内部事件 . 您会对consumer.created和consumer.deleted事件感兴趣 .
收到这些事件后,您可以触发操作(创建或删除所需的队列) . 更多信息:https://www.rabbitmq.com/event-exchange.html
希望这可以帮助 .
如果允许您的使用者在代理的启动/停止期间动态绑定/取消绑定队列,则应该可以通过这种方式(例如,队列是预先设置的,并且消费者在启动期间将队列绑定到它想要从其接收消息的交换)