我正在尝试在只有一个生产者和一个消费者的模型中设置RabbitMQ,并且生产者发送的消息仅在消费者连接时才传递给消费者,但如果消费者不存在则丢弃
基本上我希望队列在没有消费者连接时丢弃它收到的所有消息。
另一个约束是必须在RabbitMQ服务器端声明队列,并且不得由使用者或生产者显式创建。
这可能吗?
我看了几件事,但我似乎无法让它发挥作用:
auto_delete
设置为true意味着我的客户端永远无法再次连接到此队列。x-message-ttl
和max-length
即使连接了消费者,也可能会丢失消息。我正在寻找的效果类似于auto_delete
断开连接,auto_create
连接时。在rabbitmq中是否有一种机制可以让我这样做?
答案 0 :(得分:7)
经过一番研究后,我发现我关于x-message-ttl
的问题中的一个假设是错误的。我忽略了RabbitMQ文档中的一句话:
将TTL设置为0会导致邮件在到达队列时过期,除非它们可以立即传递给消费者
事实证明,最简单的解决方案是在我的队列中将x-message-ttl
设置为0
。
答案 1 :(得分:0)
你不能直接这样做,但有一种机制并不是很难实现。
您必须启用Event Exchange插件。这是您的服务器应用程序可以连接的交换,并将接收RabbitMQ的内部事件。您会对consumer.created和consumer.deleted事件感兴趣。
收到这些事件后,您可以触发操作(创建或删除所需的队列)。更多信息请访问:https://www.rabbitmq.com/event-exchange.html
希望这有帮助。
答案 2 :(得分:0)
如果允许您的消费者在代理的启动/停止期间动态绑定/取消绑定队列,则应该可以通过这种方式(例如,队列是预先设置的,并且消费者在启动期间将队列绑定到它想要接收的交换机消息来自)