繁体   English   中英

芹菜不处理RabbitMQ的任务

[英]Celery not processing tasks from RabbitMQ

我有一个配置为使用“ RabbitMQ”作为消息传递后端的名为“ longjobs”的队列来处理任务的Celery 4.1 Worker。

我的Celery配置和工作程序是通过Django 1.11项目管理的。

没有任何错误,但是从我的Django应用程序启动的任务永远不会被我的工作人员接管。

我的celery.py文件如下所示:

from __future__ import absolute_import
import os
import sys

from celery import Celery
from celery._state import _set_current_app
import django

app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
_set_current_app(app)

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.settings')
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../myproject')))
django.setup()
from django.conf import settings
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

我的Django Celery设置是:

CELERY_IGNORE_RESULT = False
CELERY_TRACK_STARTED = True
CELERY_IMPORTS = (
    'myproject.myapp.tasks',
)
CELERY_RESULT_BACKEND = 'amqp'
CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_RESULT_SERIALIZER = 'pickle'
CELERY_RESULT_PERSISTENT = True
CELERY_ALWAYS_EAGER = False
CELERY_ROUTES = {
    'mytask': {'queue': 'longjobs'},
}
CELERY_WORKER_PREFETCH_MULTIPLIER = CELERYD_PREFETCH_MULTIPLIER = 1
CELERY_SEND_TASK_ERROR_EMAILS = True
CELERY_ACKS_LATE = True
CELERY_TASK_RESULT_EXPIRES = 360000

然后通过以下方式启动我的工作人员:

celery worker -A myproject -l info -n longjobs@%h -Q longjobs

在其日志文件中,我看到:

[2017-11-09 16:51:03,218: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672/myproject
[2017-11-09 16:51:03,655: INFO/MainProcess] mingle: searching for neighbors
[2017-11-09 16:51:05,441: INFO/MainProcess] mingle: all alone
[2017-11-09 16:51:06,162: INFO/MainProcess] longjobs@localhost ready.

指示工作程序已使用正确的虚拟主机和队列名称成功连接到RabbitMQ。

我正在使用Flower和RabbitMQ管理界面进行调试。 Flower确认我的工人正在运转,但表示从未收到任何任务。

RabbitMQ管理员有点陌生。 它说我的“ myproject”虚拟主机存在“ longjob”队列,它也没有收到任何任务,但是有很多带有名称的UUID的队列,其中包含不同数量的“ ready”任务待定。 其中之一具有200多个任务。

为什么我的Celery工人不能正确地从RabbitMQ提取任务? 我没有在任何日志文件中看到任何错误。 我该如何诊断?

抱歉,我无法发表评论,但是您的节拍过程在哪里? 您可以使用--beat选项(不建议用于生产环境)运行工作程序,也可以单独运行beat流程。

celery beat -A myproject -l info [--detach]

尝试将CELERY_ROUTES更改为CELERY_TASK_ROUTES (在4.x版中)。

或者,我宁愿更改您的路由器:

CELERY_ROUTES = {
    'mytask': {'queue': 'longjobs'},
}

至:

CELERY_ROUTES = {
    'mytask': {
        'exchange': 'longjobs',
        'exchange_type': 'longjobs',
        'routing_key': 'longjobs'
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM