RabbitMQ:在没有连接消费者时删除消息

时间:2017-07-26 13:02:06

标签: rabbitmq amqp

我正在尝试在只有一个生产者和一个消费者的模型中设置RabbitMQ,并且生产者发送的消息仅在消费者连接时才传递给消费者,但如果消费者不存在则丢弃

基本上我希望队列在没有消费者连接时丢弃它收到的所有消息。

另一个约束是必须在RabbitMQ服务器端声明队列,并且不得由使用者或生产者显式创建。

这可能吗?

我看了几件事,但我似乎无法让它发挥作用:

  1. 持久与非持久不起作用,因为它仅在代理重新启动时有用。我需要相同的效果,但是在连接上。
  2. 在队列中将auto_delete设置为true意味着我的客户端永远无法再次连接到此队列。
  3. x-message-ttlmax-length即使连接了消费者,也可能会丢失消息。
  4. 我看过主题交换,但据我所知,这些只会影响交换机和队列之间基于消息内容的消息路由,并且不能考虑队列是否存在联系消费者。
  5. 我正在寻找的效果类似于auto_delete断开连接,auto_create连接时。在rabbitmq中是否有一种机制可以让我这样做?

3 个答案:

答案 0 :(得分:7)

经过一番研究后,我发现我关于x-message-ttl的问题中的一个假设是错误的。我忽略了RabbitMQ文档中的一句话:

  

将TTL设置为0会导致邮件在到达队列时过期,除非它们可以立即传递给消费者

     

https://www.rabbitmq.com/ttl.html

事实证明,最简单的解决方案是在我的队列中将x-message-ttl设置为0

答案 1 :(得分:0)

你不能直接这样做,但有一种机制并不是很难实现。

您必须启用Event Exchange插件。这是您的服务器应用程序可以连接的交换,并将接收RabbitMQ的内部事件。您会对consumer.created和consumer.deleted事件感兴趣。

收到这些事件后,您可以触发操作(创建或删除所需的队列)。更多信息请访问:https://www.rabbitmq.com/event-exchange.html

希望这有帮助。

答案 2 :(得分:0)

如果允许您的消费者在代理的启动/停止期间动态绑定/取消绑定队列,则应该可以通过这种方式(例如,队列是预先设置的,并且消费者在启动期间将队列绑定到它想要接收的交换机消息来自)