在没有声明队列或在basic_publish中提及的情况下生成消息并发送消息时,消息(在and中)存储在哪里?我必须使用的代码看起来像这样:
... 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()我在网上找过我的能力,但还没有找到答案。我有一种预感,只要这个消息不被使用,兔子就会创建一个队列,我担心的是,如果它必须声明这个队列,然后销毁几个队列,这对兔子来说将是相当繁重的(数千!?)每分钟/小时次数。
发布于 2012-08-20 21:12:16
当您发布时,您(通常)发布到exchange,就像您正在做的那样。交换决定如何处理该消息。如果与该消息无关,则将其丢弃。如果与该消息有关,则相应地路由该消息。
在您的原始代码片段中,如果没有声明队列,消息将被丢弃。
正如您在评论中所说的,有一个由生产者创建的队列。这里有一些你还没有说明的选项。我会试着浏览所有的可能性。通常,您将在使用者中声明队列。但是,如果您希望确保消费者看到所有消息,则必须由生产者创建队列,并由生产者将其绑定到交换,以确保每个消息最终都在此队列中。然后,当队列被使用者使用时,它将看到所有消息。或者,您可以使用命令行或管理gui从代码外部将队列创建为非自动删除队列,也可以创建为持久队列(这将保留队列,即使您重新启动了RabbitMQ)。您仍然需要在生产者中为交换做一个声明,以便发送和接收消费者中的声明,但它们的交换和队列已经存在,您只需连接到它们即可。
队列和交换不是持久的,它们是持久的还是不持久的,这意味着它们将在重启RabbitMQ后存在。队列具有自动删除功能,因此当消费者与队列断开连接时,队列将不再存在。
消息可以是持久的,因此,如果您将消息发送到将被路由到队列的exchange,则不会读取该消息,并且RabbitMQ重新启动时,该消息在重新启动时仍将存在。即使消息不是持久的,如果队列不是持久的,那么它也会丢失,或者如果消息一开始就没有路由到队列。
确保在创建队列后,使用与消息的路由键相同的键将队列正确绑定到交换。
https://stackoverflow.com/questions/12037376
复制相似问题