12

我希望能够以编程方式生成 celerybeat 条目并在添加条目时重新同步 celerybeat。这里的文档状态

默认情况下,条目取自 CELERYBEAT_SCHEDULE 设置,但也可以使用自定义存储,例如将条目存储在 SQL 数据库中。

所以我想弄清楚我需要扩展哪些类才能做到这一点。

我一直在查看celery scheduler docsdjcelery api docs但是关于其中一些方法的作用的文档是不存在的,因此将深入研究一些来源,只是希望有人能指出我正确的方向。

我想我正在做的高水平工作会有所帮助......作为用户,我需要能够从一组预定义的任务中进行选择,并为用户提供一种选择某种自定义计划的方法执行,例如每天/每周/每月以及什么日期和时间。

这也是在带有 djcelery 的 Django 中。

更新

我看到了 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')

数据库中的数据看起来是正确的,但是当守护程序运行时,它会出现以下错误:

[2012-03-06 00:23:07,926:警告/节拍] 过程节拍:
[2012-03-06 00:23:07,926:警告/节拍] 回溯(最后一次通话):
[2012-03-06 00 :23:07,926: WARNING/Beat] 文件“/usr/lib/python2.7/multiprocessing/process.py”,第 258 行,在 _bootstrap
[2012-03-06 00:23:07,926: WARNING/Beat] self.运行()
[2012-03-06 00:23:07,927:警告/节拍]文件“/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat .py",第 464 行,运行中
[2012-03-06 00:23:07,927:警告/节拍] self.service.start(embedded_process=True)
[2012-03-06 00:23:07,927:警告/节拍] 文件“/home/dchesterman/Documents/PythonDev /.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py”,第 403 行,开始
[2012-03-06 00:23:07,927:警告/节拍] 间隔 = self.scheduler.tick()
[2012-03-06 00:23:07,927:警告/节拍] 文件“/home/dchesterman/Documents/ PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py",第 194 行,在刻度
[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] 文件“/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site -packages/celery/beat.py",第 170 行,在 may_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:警告/节拍] 文件“/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/djcelery/schedulers.py” ,第 54 行,在 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' 对象没有属性 'is_due'

我不确定为什么我的日程安排不使用默认设置is_due()

4

2 回答 2

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 中。

于 2012-04-25T16:50:52.203 回答
1

我认为您想要做的是将PeriodicTasks 添加到数据库中。看起来https://github.com/ask/django-celery/blob/master/djcelery/admin.py的底部是他们在管理员中添加任务的方式——你需要在前端。

于 2012-03-04T06:22:13.467 回答