2015-06-10 65 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']

    雖然我並不需要它。但它幫助我,因爲出現了新的錯誤日誌。在我的任務文件中,我導入了不存在的應用程序。

    這可能是由非常混亂的原因造成的......很多時候有語法錯誤或類似的東西。