我正在用芹菜建造一个烧瓶应用程序,使用rabbitmq作为芹菜的后端。
我对芹菜的说法是
CELERY_BROKER_URL='amqp://localhost:5672',
CELERY_RESULT_BACKEND='amqp://',
CELERY_QUEUE_HA_POLICY='all',
CELERY_TASK_RESULT_EXPIRES=None
然后,声明一个队列会产生一大堆错误
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue=new_task_id)
错误
PreconditionFailed: Queue.declare: (406) PRECONDITION_FAILED - inequivalent arg
'durable' for queue '1419349900' in vhost '/':
received 'true' but current is 'false'
好的,我将其更改为channel.queue_declare(queue=new_task_id, durable=True)
再次,错误
PreconditionFailed: Queue.declare: (406) PRECONDITION_FAILED - inequivalent arg
'auto_delete' for queue '1419350288' in vhost '/':
received 'true' but current is 'false'
好的,我将其更改为channel.queue_declare(queue=new_task_id, durable=True, auto_delete=True)
这次错误消失了。
但是在得到这些错误之前我怎么知道呢?我在this topic搜索了芹菜的文档,详细的文档,但没有得到我需要的东西 - 它只是列出了所有的配置项,但没有告诉我如何设置它。或者是我应该参考的rabbitmq的文档?
谢谢!
修改
So, all Queues declared in your configuration file, or in any registered tasks.
你能解释一下吗? declare
和create
之间有什么区别?
您说Result queues will be created with 'durable', 'auto-delete' flags
,我在哪里可以找到这些信息?芹菜如何知道队列是result queue
?
答案 0 :(得分:1)
Celery的默认行为是创建所有缺失的队列(请参阅CELERY_CREATE_MISSING_QUEUES Documentation。默认情况下,将使用“耐用”标志创建任务队列。结果队列将使用'耐用&#创建39;,'自动删除'标记和' x-expires'如果您的CELERY_TASK_RESULT_EXPIRES
参数不是None(默认情况下,它设置为1天)。< / p>
因此,所有队列都在您的配置文件或任何已注册的任务中声明。此外,当您使用amqp结果后端时,如果您没有设置CELERY_IGNORE_RESULT
参数,则将在初始化tash时创建结果队列,并将其命名为task_id。
因此,如果您尝试使用冲突的配置重新声明此队列,RabbitMQ将拒绝它。因此,您不必创建它。
修改强>
如pika documentation所示,队列&#34;声明&#34;允许检查RabbitMQ中是否存在队列,如果没有,则创建它。如果Celery配置中的CELERY_CREATE_MISSING_QUEUES
设置为True,则在初始化时,CELERY_QUEUES
或CELERY_DEFAULT_QUEUE
参数中列出的任何队列,或注册任务选项中声明的任何自定义队列,例如{{1或者甚至在自定义@task(name="custom", queue="my_custom_queue")
定义中,对于RabbitMQ将是"declared",因此如果它们不存在则会被创建。
可以在Using Transient Queues段落中找到队列参数化文档here,但最好的方法是使用RabbitMQ管理插件,允许您在Web UI中监视声明的队列及其配置(您可以看到Durable的D标志和自动删除的AD标志)。
最后,芹菜不知道&#34;如果队列是结果队列,但在创建时,会将任务分配给唯一标识符。该标识符将用作任何结果的队列名称。这意味着如果任务的生产者等待结果,它将在每次创建时监听该队列。消费者,一旦完成任务,在任务真正执行之前,如果任务不忽略结果(通过设置CELERY_ROUTING
或任务自定义选项),将检查是否存在名为任务标识符的队列如果没有,它将使用默认的Result配置(参见the Result Backend configuration)