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

摘要:
最理想的解决方案,还是单独写一个定时调度器,替代djcelery,但是难度较大。如果会Java的话,可以使用Java的一些定时调度功能取代pythoncelery这块,毕竟Java的生态圈要比python更丰富。

一、需求

结合上一篇,使用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字段。保存成一坨,没办法批量增删改查。

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

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

基于Django+celery二次开发动态配置定时任务 ( 二)第2张

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

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

对应djcelery_periodictask表里的主键id。

基于Django+celery二次开发动态配置定时任务 ( 二)第3张

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

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

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

三、总结

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

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

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

免责声明:文章转载自《基于Django+celery二次开发动态配置定时任务 ( 二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇centos 7设置静态IP将html导入到excel或word itprobie下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Mysql数据库】知识点总结

本文转载自:http://www.cnblogs.com/tonghun/p/7191131.html一 数据库常用操作 mysql -u+username -p+password:登陆数据库管理系统,如mysql -uroot -p123。 create database dbName:创建数据库。 drop database dbName:删除数...

大型php网站性能和并发访问优化方案

网站性能优化对于大型网站来说非常重要,一个网站的访问打开速度影响着用户体验度,网站访问速度慢会造成高跳出率,小网站很好解决,那对于大型网站由于栏目多,图片和图像都比较庞大,那该怎么进行整体性能优化呢?本文为你提供一份大型php网站性能和并发访问优化方案. 一、大型网站性能提高策略: 大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案...

SqlServer 增加字段、修改字段类型

1.增加字段 ---alter table 表名 add 字段名 type not null  SQL语句:ALTER TABLE  crms_volunteer_group_member  Add crms_withdraw Bit 2.修改字段类型 --alter table 表名 alter column 字段名 type not null SQL语...

Delphi笔记数据库开发

Delphi笔记-数据库开发  数据集的每一列被称为一个字段,每一行被称为一个记录。 •数据集:是一个分立的数据记录的集合。数据集由VCL的TDataSet表示。 •表:一种特殊类型的数据集。表一般是一个实际存储在磁盘上、包含有数据记录的文件。VCL的TTable类中封装了它的各种功能。 •查询:也是一种特殊类型的数据集。它可以被看作是执行了特殊命令后所产...

mysql入门(一)

数据库介绍 数据库是在计算机出现以后,为了解决计算机存储问题而创建,数据库中包含表,表当中才是数据。 数据库的发展史 1. 萌芽阶段 所有存储依赖的都是文件,安全性低,查找非常困难。 2. 层次模型 1). 优点:查询分类的效率高; 2). 缺点:导航结构:如果查找同类别数据,效率低。 数据不完整(如下图) 3. 网状模型 数据不完整性:我们认为每一行数...

Oracle字段增删改、添加约束

添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….); 修改字段的语法:alter table tablename modify (column datatype [default value][null/not null],….); 删除...