Celery:忽略配置文件中的BROKER_URL

时间:2013-11-12 19:58:48

标签: celery config configuration-files

我的问题是this one的副本,但更详细。

问题是我在Celery配置文件中设置了BROKER_URL,但是没有反映出来并且我加载配置:我检查了,它是 被加载 - 事实上,其中定义的其他常量被设置,而不是BROKER_URL

这似乎是一个错误,但我想确定。


celeryconfig.py

BROKER_URL = "amqp://user:password@remote.server.com:5672//vhost"

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = True

JSON被用作序列化程序,而不是Pickle,所以我知道这是有效的。)

app.py

from celery import Celery

app = Celery('tasks', broker='amqp://guest@localhost//')
app.config_from_object('celeryconfig')

调用工作人员:

celery -A app.app worker -l info

但后来我明白了:

[2013-11-12 11:20:51,610: INFO/MainProcess] consumer: Connected to amqp://guest@127.0.0.1:5672//.

我尝试分手BROKER_URL,但无济于事:

BROKER_TRANSPORT = 'amqp'
BROKER_USER = 'user'
BROKER_PASSWORD = 'password'
BROKER_HOST = 'remote.server.com'
BROKER_PORT = 5672
BROKER_VHOST = '/vhost'

有趣的是,当我在BROKER_URL中明确设置app.py时,它确实有效:

from celery import Celery

app = Celery('tasks', broker='amqp://guest@localhost//')
app.config_from_object('celeryconfig')
app.conf.BROKER_URL = "amqp://user:password@remote.server.com:5672//vhost"

3 个答案:

答案 0 :(得分:14)

当然,我在完成这个问题之后立即意识到我做错了什么,但我仍然发布了它,因为有人可能觉得它很有用。

我的问题是我复制并粘贴了教程中的代码(* facepalm)。

当我使用broker arg定义应用时,我正在覆盖配置文件:

app = Celery('tasks', broker='amqp://guest@localhost//')

只需删除:

app = Celery('tasks')

多田!一切都很好......我学到了宝贵的一课。

答案 1 :(得分:3)

只是为了澄清,因为你正在使用它:

app.config_from_object('django.conf:settings', namespace='CELERY')
你的celeryconfig.py中的

CELERY_BROKER_URL = "amqp://user:password@remote.server.com:5672//vhost"

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = True

答案 2 :(得分:0)

对于其他存在类似问题的人,我也遇到了具有不同原因的类似问题。

我在heroku上将celery和django一起使用,但是在我的开发环境中,我正在使用django-environ从文件中填充环境变量。

我忘了以celery -A myapp worker -l info开头我的celery worker命令

所以我从:

DJANGO_READ_DOT_ENV_FILE=1 celery -A myapp worker -l info

ObjectId

傻,但很好的提醒。希望它可以节省一些时间。