我的问题是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"
答案 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
傻,但很好的提醒。希望它可以节省一些时间。