一、需求

结合上一篇,使用djcelery模块开发定时任务时,定时任务的参数都保存在djcelery_periodictask表的args、kwargs字段里,并且是json格式。那么,当定时任务多了之后,批量修改定时任务的某个参数时很草蛋,

比如,我的平台目前有100多个定时任务,定时任务的功能就是去生产数据库里执行SQL,并将结果生成excel表,然后自动发送给相关收件人。定时任务的参数就是SQL语句、生产库IP、收件人地址等等,当运营部门说,

我们需要在20个定时任务里增加3个人员的收件人地址,那就头疼了,由于定时任务的所有参数都是以json格式保存在args字段里,没法通过SQL语句批量修改,只能在页面一个一个点!累死了!

而要实现批量修改的功能,之前想到的是以下3种:

1、通过写脚本,先去数据库里把args、kwargs字段的值取出来,然后一个个改,改完再回写到djcelery_periodictask表里,但是感觉还是很繁琐,没有直接写SQL语句来的简单、灵活。(SQL写一个单表查询,python得写10行)

2、使用SQL语句的json语法实现。MySQL5.7以后支持json格式字段的增删改查,语法太复杂,拼了一整天SQL语句,放弃了。

3、抛弃djcelery模块,基于Django + celery 重写一个调度器来实现动态配置定时任务,并且可以使用SQL批量增删改查。看了下djcelery源码,算了。

现在想到了两个个折中的办法:

1、就是把定时任务的各个参数,单独建表保存,然后将主表的id号保存在djcelery_periodictask表的args字段里。执行定时任务时,先通过args的字段获取id号,再通过id去主表里查询定时任务的各个参数,有了这些参数,就能

执行定时任务了,如果需要批量修改,直接写SQL就能实现。

2、把djcelery_periodictask表的主键id号保存到args字段里,再新建表,保存定时任务的各个参数及djcelery_periodictask表的主键id。执行定时任务时,先获取djcelery_periodictask表的主键id,再去新建表里,通过id获取定时任务

的各个参数,这样就能执行任务了。(我用的第二种,两种方法原理一样。)

二、实现方法

       先看看原始的djcelery_periodictask表保存的args、kwargs字段。保存成一坨,没办法批量增删改查。

现在改成,在args字段里只保存id号,注意:这个id号就是djcelery_periodictask表的主键id

我的定时任务主要功能是去生产库执行SQL查询数据,生成excel表,最后发邮件给各个收件人,所以我单独建了四张表去保存这些参数。

主表是data_apply,通过和其它表进行关联查询,就能得到定时任务所需要的SQL语句、收件人、数据库ip等等参数。而主表的djcelery_periodictask_id字段就

对应djcelery_periodictask表里的主键id。

因为arg字段就保存的就是djcelery_periodictask表里的主键id,在写定时任务的模板函数时,通过arg获取到djcelery_periodictask表的主键id后,就可以去主表data_apply里根据djcelery_periodictask_id号查询定时任务的其它参数,

最后就可以执行后面的定时任务了。

 @shared_task(name='fun1')
def fun1(_id):
"""
定义定时任务模板函数时,传入的arg、kwargs参数,而arg里保存的是id号,通过id去主表里查询任务参数
1.sql语句:select * from 主表 where djcelery_periodictask_id =_id
2.Django ORM
""" ... ... # 获取到参数后再执行任务逻辑 ... ...  

三、总结

单独建表保存定时任务的相关参数,在对定时任务进行批量的增删改查时更灵活,扩展也方便,但是需要一定的SQL基础。

最理想的解决方案,还是单独写一个定时调度器,替代djcelery,但是难度较大。

如果会Java的话,可以使用Java的一些定时调度功能取代python celery 这块,毕竟Java的生态圈要比python更丰富。

基于Django+celery二次开发动态配置定时任务 ( 二)的更多相关文章

  1. 基于Django+celery二次开发动态配置定时任务 ( 一 )

    需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还 ...

  2. celery 动态配置定时任务

    How to dynamically add or remove tasks to celerybeat? · Issue #3493 · celery/celery https://github.c ...

  3. Django + Celery 实现动态配置定时任务

    哈喽,今天给大家分享一篇Django+Celery实现动态配置定时任务,因为最近也是无意间看到一位大佬关于这块的文章,然后自己觉得不错,也想学习写一下,然后最终实现功能是在前端页面统一管理计划任务,大 ...

  4. 基于Netbeans的安卓Android开发环境配置 - CSDN博客

    原文:基于Netbeans的安卓Android开发环境配置 - CSDN博客 基于Netbeans的安卓Android开发环境配置 一.准备工作 NetBeans 勾选网页中的Accept-选择对应系 ...

  5. 基于Eclipse的Hadoop应用开发环境配置

    基于Eclipse的Hadoop应用开发环境配置 我的开发环境: 操作系统ubuntu11.10 单机模式 Hadoop版本:hadoop-0.20.1 Eclipse版本:eclipse-java- ...

  6. 基于django的视频点播网站开发

    项目名称 基于django的视频点播网站开发 项目背景 学习完毕python和django之后,想找个项目练练手,本来想写个博客项目练手,无奈别人已经写过了,所以笔者就打算写一个视频点播网站,因为笔者 ...

  7. 金蝶K3 wise 插件二次开发与配置

    金蝶K3 wise 插件二次开发与配置 开发环境:K/3 Wise 13.0.K/3 Bos开发平台.Visual Basic 6.0 目录 一.二次开发插件编程二.代码演示三.配置插件四.测试插件五 ...

  8. 基于django的个人博客网站建立(二)

    基于django的个人博客网站建立(二) 前言 网站效果可点击这里访问 今天主要完成后台管理员登录的状态以及关于文章在后台的处理 具体内容 首先接上一次内容,昨天只是完成了一个登录的跳转,其他信息并没 ...

  9. Django+Celery+xadmin实现异步任务和定时任务

    Django+Celery+xadmin实现异步任务和定时任务 关注公众号"轻松学编程"了解更多. 一.celery介绍 1.简介 [官网]http://www.celerypro ...

随机推荐

  1. 链接ftp,把文件或图片上传到ftp指定的文件夹中

    /******************************************************************** *  * * Filename : .java * Auth ...

  2. Nginx搭建后,图片存储在Tomcat上,前端无法回显图片问题

    一.Nginx与Tomcat连接搭建的环境,Nginx设置了前端的访问路径为 (1)前端代码配置: root /usr/local/nginx/html; index index.html index ...

  3. C++11新标准学习

    <深入理解C++11:C++11新特性解析与应用> <华章科技:深入理解C++11:C++11新特性解析与应用>一共8章:第1章从设计思维和应用范畴两个维度对C++11新标准中 ...

  4. struts2 动态Action

    1.java 2.struts.xml struts2.5,默认关闭动态Action,着色的是开启和使用动态action 3.JSP 小结:访问时,用!后跟方法名的方法,方法返回值----->r ...

  5. EBS单实例上所有正在运行的并发请求以及请求目前的状态

    --EBS单实例上所有正在运行的并发请求以及请求目前的状态---一个实例上运行的所有并发请求的总结和他们目前的状态以及等待状态    select w.seconds_in_wait "Se ...

  6. Android-进程理解/进程的优先级别

    进程理解 Android系统最小的控制单元是:进程 process 应用/CPU最小的控制单元是:线程 thread 一个应用一个 process 进程 一个应用一个 package(包是唯一的) 一 ...

  7. network_node:host解决Docker容器化部署微服务出现的Dobbo通信问题

    在Docker中,有时候出现 ports:   - 20880:20880 Dobbo通信出现问题. 此时应该改成 network_node:host 注释 ports!

  8. Rsyslog远程传输的几种方式

    基本介绍 Rsyslog是一个syslogd的多线程增强版,rsyslog vs. syslog-ng 链接是rsyslog官方和syslog特性和性能上的一些对比,目前大部分Linux发行版本默认也 ...

  9. TFS (Team Foundation Server) 2013集成Maven构建

    Team Foundation Server原生就支持跨平台的构建,包括Ant和Maven两种构建方式.通过配置构建服务器,连接TFS源代码库,可以实现持续集成构建,自动检测代码库健康状况,进而实现自 ...

  10. 为Visual Studio添加一个“编码的UI测试生成器”的快捷方式

    在添加CodedUI测试用例时,经常需要查看捕获控件的属性.按照常规的方式,只有在添加一个全新的CodedUI编码测试时才能查看捕获控件的属性,这样很不方便. 下面介绍在Visual Studio工具 ...