2015-06-10 38 views
0

我已经阅读了不少类似于此的帖子,但没有一篇似乎对我有意义。芹菜“收到未注册任务的类型”

我想配置芹菜PeriodicTask以每5秒闪光,但是我就要挂了一个芹菜配置问题(我认为)

通信/ tasks.py

import datetime 
from celery.decorators import periodic_task 

@periodic_task 
def send_queued_messages(): 
    # do something... 

的myapp/settings.py

... 
from comm.tasks import send_queued_messages 
from datetime import timedelta 
CELERYBEAT_SCHEDULE = { 
    'send_queued_messages_every_5_seconds': { 
     'task': 'comm.tasks.send_queued_messages', # Is the issue here? I've tried a dozen variations!! 
     'schedule': timedelta(seconds=5), 
     }, 
    } 

从我的错误日志中的相关输出:

23:41:00 worker.1 | [2015-06-10 03:41:00,657: ERROR/MainProcess] Received unregistered task of type 'send_queued_messages'. 
23:41:00 worker.1 | The message has been ignored and discarded. 
23:41:00 worker.1 | 
23:41:00 worker.1 | Did you remember to import the module containing this task? 
23:41:00 worker.1 | Or maybe you are using relative imports? 
23:41:00 worker.1 | Please see http://bit.ly/gLye1c for more information. 
23:41:00 worker.1 | 
23:41:00 worker.1 | The full contents of the message body was: 
23:41:00 worker.1 | {'utc': True, 'chord': None, 'args': [], 'retries': 0, 'expires': None, 'task': 'send_queued_messages', 'callbacks': None, 'errbacks': None, 'timelimit': (None, None), 'taskset': None, 'kwargs': {}, 'eta': None, 'id': 'a8ca18...227a56'} (216b) 
+0

消息正文显示调用的任务是'send_queued_messages' - 然而'CELERYBEAT_SCHEDULE'具有'comm.tasks.send_queued_messages' - 参见[命名]上的文档(http://celery.readthedocs.org/en/latest /userguide/tasks.html#names) – scytale

+0

当我将CELERYBEAT_SCHEDULE更改为send_queued_messages时,它仍然不起作用,我收到相同的错误消息。 –

+1

尝试运行'芹菜检查注册'看看你的任务是否正确注册 – scytale

回答

0

有关任务命名的说明,请参见the celery docs

在这种情况下,您需要为celerybeat提供可找到的任务名称。

试试这个:

CELERYBEAT_SCHEDULE = { 
    'send_queued_messages_every_5_seconds': { 
     'task': 'myapp.tasks.send_queued_messages', 
     'schedule': timedelta(seconds=5), 
     }, 
    } 
+0

感谢您的建议。我尝试了你建议的配置,也是我在上面的帖子中添加的配置。我仍然收到同样的错误。关于我做错什么的想法? –

2

我遇到了这个确切的问题,而且事实证明这个问题是不是与名的任务,但芹菜工人不知道你的任务模块。

换句话说,你的任务名称正确('comm.tasks.send_queued_messages'),它是由任务装饰器生成的,你只是没有告诉芹菜在哪里寻找它。

最快的解决方案是添加以下myapp/settings.py:“模块的序列工人开始时导入”

CELERY_IMPORTS = ['comm.tasks'] 

根据the docs,这决定了

或者,您可以配置设置来自动发现任务(see docs here),但你必须命名空间的任务模块(S),移动comm/tasks.pycomm/comm/tasks.py

对我来说,混乱来自芹菜的自动命名约定,这看起来像导入语句,这使我相信我是用CELERYBEAT_SCHEDULE['task']告诉芹菜哪里寻找任务。相反,调度器只是将该名称作为一个字符串。

0

我只是遇到了同样的问题。我做错了什么,我没有正确地终止我的芹菜任务之一(如你的案例中名为'send_queued_messages'),让它在后台运行,并继续发送名为'send_queued_messages'的任务。这似乎不是一个大问题,只要你在你的代码中仍然有这个任务。

但在我的情况下,我修改我的任务名称后,不同的东西(如'comm.tasks.send_queued_messages')。这使得名为'send_queued_messages'的任务成为'未注册的任务',我想。

下面是我做过什么来解决:

  1. 杀死所有的芹菜过程:

PS auxww(而不是芹菜文件指示“芹菜工人的grep '芹菜') | grep'芹菜'| awk'{print $ 2}'| xargs的杀-9

  • 重启RabbitMQ的:(或任何代理使用)
  • 须藤-u的RabbitMQ rabbitmqctl停止
    须藤的RabbitMQ服务器

    然后错误消失了。

    1

    如果您在使用proj/proj/celery.py下面的代码下面celery document

    # Load task modules from all registered Django app configs. 
    app.autodiscover_tasks() 
    

    ,它看起来与pefect教程,

    不要忘记你的新的应用程序在settings.py

    0

    芹菜添加到INSTALLED_APPS - 抛出了同样的问题,上面写的东西没有帮助我。

    我想这个片段插入到我的设置文件:

    CELERY_IMPORTS = ['myapp.tasks']

    虽然我并不需要它。但它帮助我,因为出现了新的错误日志。在我的任务文件中,我导入了不存在的应用程序。

    这可能是由非常混乱的原因造成的......很多时候有语法错误或类似的东西。