当您生成消息并发送消息而未声明队列或在basic_publish中提及消息时,消息存储在哪里(在兔子中)?我必须使用的代码看起来像这样:
... bunch of setup code (no queue declaring tho)...
channel.exchange_declare(exchange='name', type='direct')
channel.basic_publish(exchange='exch_name', routing_key='rkey', body='message' )
conn.close()
我已经通过网络查看了我的能力,但还没有找到答案。我有一种预感,只要这条消息没有被消耗,兔子会创建一个队列,而我担心如果它必须声明这个队列然后将其摧毁几千个,这对兔子来说会非常沉重! ?)每分钟/小时的时间。
答案 0 :(得分:1)
当您发布时(通常)发布到交易所,就像您正在做的那样。交易所决定如何处理该消息。如果与消息无关,则将其丢弃。如果与消息有关,则相应地路由它。
在未声明队列的原始代码段中,将丢弃该消息。
正如您在评论中所说,生产者创建了一个队列。这里有一些你没有说明的选择。我会尽力尝试各种可能性。通常您会在使用者中声明队列。但是,如果您希望确保消费者看到所有消息,那么队列必须由生产者创建并由生产者绑定到交换,以确保每个消息都在此队列中结束。然后,当消费者使用队列时,它将看到所有消息。或者,您可以从代码外部创建队列作为非自动删除队列,并且可能使用命令行或管理gui作为持久队列(即使重新启动RabbitMQ也会保留队列)。您仍然需要在生产者中进行交换声明,以便在消费者中发送和声明接收,但他们的交换和队列已经存在,您只需要连接到它们。
队列和交换不持久它们是否持久,这意味着它们将在重启RabbitMQ后存在。队列具有自动删除功能,以便当消费者与消费者断开连接时,它们将不再存在。
消息可以是持久性的,因此如果您将消息发送到将被路由到队列的交换机,则不会读取消息并重新启动RabbitMQ,重新启动时消息仍然存在。即使消息不是持久的,如果队列不耐用,那么它将丢失,或者如果消息首先没有路由到队列。
确保在创建队列后,使用您用作邮件路由键的相同密钥将队列正确绑定到交换机。