2013-03-20 35 views
1

我有一些客户端通过autodelete:yes连接到交换机。这些都是出版商和消费者。但基本上现在让我们假设他们正在发布消息。因为每个客户端都有唯一的绑定密钥,所以我可以在使用这些计算机的计算机上的每条消息上做明确的内容。一切正常。当在rabbitmq上删除队列时通知消费者

现在,如果客户端崩溃或我手动终止它(通过SIGINT,ctrl + c),然后队列被删除。有什么方法可以通知远程机器上的用户队列被删除吗?

我正在考虑在我的客户端应用程序上创建一个信号处理程序,因此无论何时我会捕获一个SIGINT或SIGTERM,然后我会通知远程使用者(我会向他们发送一条消息, ID将被删除)

有没有其他的方式来做到这一点,或者是我的方式做到这一点的正确方法?

+0

能否请你澄清?当一个队列被删除时,消费者随之被删除(并且伴随的通道被关闭)。因此,不应该有消费者通知。 – theMayer 2013-03-20 18:43:14

+0

我会澄清内容。基本上对于消费者来说,我的意思是一台远程机器,它正在从我的客户正在发布的交换机中消费。 – 2013-03-20 22:09:53

+0

您正在使用扇出或主题交换?我想你可能想提供一个显示你的拓扑结构的图表,因为谁发布到哪里以及谁在哪里消费,并不是很清楚。 – theMayer 2013-03-20 23:11:55

回答

1

如消息一般来说,消费应用程序不关心生产应用程序的状态。

在RabbitMQ中,通过两种机制之一产生应用程序可能会意识到消费应用程序的状态。第一种(也是首选)方法是通过Dead-Letter Exchange (dlx)。当您的消息无法传递时(因为目标队列不存在),它将在此处路由,并且您的应用程序可以将消息从DLX上配置的队列中取出,以确定它们是否未到达目的地。

第二种方法是在消息上设置Mandatory标志。如果目标队列不在那里,这将导致代理通过Basic.Return方法将消息直接发送回生产应用程序。

如果上述项目不能满足您的需求,您可能需要重新审视您的体系结构,因为可能有更好的方法来设计您的应用程序。

+0

立即消息有意义。感谢您的注意。我会尝试一下并用我的结果评论回来。 – 2013-03-20 23:23:48

+0

我的不好,我的意思是写强制性的。 – theMayer 2013-03-20 23:30:36

相关问题