2012-03-03 50 views
11

我希望能夠以編程方式生成celerybeat條目和resync celerybeat添加條目時。該文檔here狀態如何以編程方式生成celerybeat條目與芹菜和Django

By default the entries are taken from the CELERYBEAT_SCHEDULE setting, but custom stores can also be used, like storing the entries in an SQL database.

所以我試圖找出我需要擴展到能夠做到這一點,其類。

我一直在尋找celery scheduler docsdjcelery api docs,但是這些方法中的某些方法的文檔是不存在的,所以我們不打算潛入某些源代碼,只是希望有人能指出我朝着正確的方向。

我想我做的事情的高層次是有幫助的......作爲一個用戶,我需要能夠從一組預定義的任務中進行選擇,併爲用戶提供一種方法來選擇某種自定義計劃執行,例如每天/每週/每月以及每天和每個時間。

此外,這是在djcelery與Django。

UPDATE

我看到了djcelery管理的代碼,但我不上的數據是如何被持久清晰。我現在有一個通用的addTask認爲是這樣的:

def addTask(request): 

intervalSchedule = IntervalSchedule.from_schedule(schedule(timedelta(seconds=10))) 
intervalSchedule.save() 
modelData = dict(
    name="dcTestPersist", 
    task="technologytrackerapi.views.createRecord", 
    schedule=intervalSchedule, 
) 
periodicTask = PeriodicTask(**modelData) 
periodicTask.save() 
return render_to_response('taskView.html') 

數據在db正確的,但在後臺運行時,它有這個錯誤:

[2012-03-06 00:23:07,926: WARNING/Beat] Process Beat:
[2012-03-06 00:23:07,926: WARNING/Beat] Traceback (most recent call last):
[2012-03-06 00:23:07,926: WARNING/Beat] File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
[2012-03-06 00:23:07,926: WARNING/Beat] self.run()
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 464, in run
[2012-03-06 00:23:07,927: WARNING/Beat] self.service.start(embedded_process=True)
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev /.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 403, in start
[2012-03-06 00:23:07,927: WARNING/Beat] interval = self.scheduler.tick()
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 194, in tick
[2012-03-06 00:23:07,927: WARNING/Beat] next_time_to_run = self.maybe_due(entry, self.publisher)
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 170, in maybe_due
[2012-03-06 00:23:07,927: WARNING/Beat] is_due, next_time_to_run = entry.is_due()
[2012-03-06 00:23:07,928: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/djcelery/schedulers.py", line 54, in is_due
[2012-03-06 00:23:07,928: WARNING/Beat] return self.schedule.is_due(self.last_run_at)
[2012-03-06 00:23:07,928: WARNING/Beat] AttributeError: 'NoneType' object has no attribute 'is_due'

我不知道爲什麼我的時間表不使用默認is_due()

回答

6

這是結束了,我的工作:

def addTask(request): 

    intervalSchedule = IntervalSchedule.from_schedule(schedule(timedelta(seconds=10))) 
    intervalSchedule.save() 

    modelData = dict(
     name="dcTestPersist", 
     task="technologytrackerapi.tasks.createRecord", 
     interval_id=intervalSchedule.pk, 
) 

    periodicTask = PeriodicTask(**modelData) 
    periodicTask.save() 

    me = ModelEntry(periodicTask) 

    try: 
     me.save() 

    except: 
    from django.db import connection 
    print connection.queries 
    raise 

    return render_to_response('taskView.html') 

我不得不換週期任務的ModelEntry。

+0

出於某種原因,我不明白我跟隨此創建我的計劃任務,並不需要包裝'ModelEntry'。不知道爲什麼或什麼'ModelEntry'是。隨機筆記 - 我也設置了'expires',並感到困惑,它沒有效果。它*有*效果,但是'celeryd'不是'celerybeat' - 'celerybeat'繼續無限觸發,但'expires'後celeryd忽略它(狀態'撤銷')。 – Chris 2016-04-28 18:52:20

+0

它是與django集成的djcelery的一部分。不知道你是否在使用它。 https://github.com/celery/django-celery 我會懷疑它。看起來不贊成。這是4歲。 – Dustin 2016-04-28 21:12:31

+0

@達斯汀抱歉,沒有那麼多要求爲其他可能會出現的人留下一個便條。您的答案是在Internet上以編程方式爲CeleryBeat安排PeriodicTask的最簡單示例!其餘的使用配置文件或只給出部分答案。 (我正在使用djcelery - 我認爲這是數據庫後端的來源,而我從djcelery.models import *'。) – Chris 2016-04-29 12:39:10