djcelery不使用admin界面,动态添加定时任务

在应用开发中有很多情况需要用到任务调度,每日统计平台访问量、清除历史日志、创建月表等任务,还有些功能是需要平台使用人员自己去添加的,比如我要填加明天下午4点的会议提醒,从网上看到的celery中似乎是没有提供这样的API接口去添加任务。

djcelery models.py

在djcelery中定义的models可以看到,有PeriodicTask、CrontabSchedule、IntervalSchedule、WorkerState、TaskState,并且在文件中可以看到

signals.pre_delete.connect(PeriodicTasks.changed, sender=PeriodicTask)
signals.pre_save.connect(PeriodicTasks.changed, sender=PeriodicTask)

这也是有的博客中提到在数据库 djcelery_periodictask 表中增加任务记录,不能被执行需要重启服务才能触发的原因。

实践

在我们的业务代码中引用
from djcelery.models import PeriodicTask, IntervalSchedule, CrontabSchedule

# -*- coding:utf-8 -*-
"""
Created on 2019/11/18

@author: jj
"""
from djcelery.models import PeriodicTask, IntervalSchedule, CrontabSchedule
from util.apiview import GomAPIView

class PeriodicTaskV(GomAPIView):
    def victim(self):
        # PeriodicTask(name='测试',
        #              task='bus_archive.tasks.ActualTotalWater',
        #              args='[]',
        #              kwargs='{}',
        #              enabled=1,
        #              interval_id=1,
        #              ).save()
        PeriodicTask.objects.filter(id=5).delete()
        

class IntervalScheduleV(GomAPIView):
    """
        PERIOD_CHOICES = (('days', _('Days')),
                  ('hours', _('Hours')),
                  ('minutes', _('Minutes')),
                  ('seconds', _('Seconds')),
                  ('microseconds', _('Microseconds')))
    """
    def victim(self):
        IntervalSchedule(every=50,
                         period='seconds'
                         ).save()

在不重启服务的情况下,新增的任务是可以正常执行的
执行结果
在这里插入图片描述

发布了57 篇原创文章 · 获赞 232 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/qq_23934063/article/details/103125810
今日推荐