让RabbitMQ等待消息消耗,然后引发异常

时间:2013-01-18 18:07:54

标签: rabbitmq

我有什么办法可以做到这一点:

  • 将消息写入队列
  • 阻止生产者流程,直到另一方有消费者
  • 如果10秒后没有消费者,则提出异常
  • 如果有消费者,请取消阻止生产者流程
  • 当达到10秒超时并且生产者端出现异常时,该消息应保留在队列中,以便消费者以后可以使用它

我希望能够以异步方式通知消费者。 到现在为止,我正在发送消息。我想知道是否有直接消费者,但如果没有,消息仍然应该在队列中。它似乎不是“直接”amqp事物的行为

1 个答案:

答案 0 :(得分:1)

有趣的问题,遗憾的是没有一个优雅的解决方案。

从RabbitMQ文档中,“立即”标志的工作原理如下:

  

如果消息无法立即路由到队列使用者,则此标志告诉服务器如何做出反应。如果设置了此标志,则服务器将返回带有Return方法的无法传递的消息。如果此标志为零,则服务器将对消息进行排队,但不保证它将被消耗。

你可以使用立即标志部分解决你的问题,我在想这样的事情:

  • 当制作人准备好对消息进行排队时,会使用立即标志设置将其触发

  • 如果返回消息,则启动计时器并在设置立即标志的情况下继续重试10秒

  • 如果尝试10秒后仍然无法获取,则将立即标志设置为false发布(以便消费者在消费者上线时将其接收)