为开源项目 go-gin-api 增加后台任务模块
任务管理界面 (WEB)

支持在 WEB 界面 中对任务进行管理,例如:新增任务、编辑任务、启用/禁用任务、手动执行任务 等。
任务的属性包括:
- 任务名称
- 执行方式
SHELLHTTP
- 表达式(*/5 * * * *)
- 命令
- 超时时间(秒)
- 重试次数
- 重试间隔(秒)
- 执行结束是否通知
- 不通知
- 失败通知
- 结束通知
- 结果关键字匹配通知
- 状态
- 备注
当执行方式为 HTTP 时,支持选择请求方式 GET 或 POST;
当设置执行结束通知时,支持选择通知方式 邮件 或 Webhook;
当设置邮件通知时,支持输入邮箱地址多个用,分割;
当设置结果关键字匹配通知时,支持输入关键字多个用,分割;
任务增加完成后,会把任务数据持久化到 MySQL 中。
任务调度器
参考了两个开源组件:
最终选择使用 jakecoffman/cron ,后者是在前者的基础上做了一定的补充,例如 AddFunc() 增加了 name 参数,同时还增加了 RemoveJob(name string) 支持删除特定的任务。
// AddFunc adds a func to the Cron to be run on the given schedule.
func (c *Cron) AddFunc(spec string, cmd func(), name string) {
c.AddJob(spec, FuncJob(cmd), name)
}
...
// RemoveJob removes a Job from the Cron based on name.
func (c *Cron) RemoveJob(name string) {
if !c.running {
i := c.entries.pos(name)
if i == -1 {
return
}
c.entries = c.entries[:i+copy(c.entries[i:], c.entries[i+1:])]
return
}
c.remove <- name
}
对其简单封装下就可以使用了,下面是封装的方法,方法的具体实现与使用从 go-gin-api 中获取。
type Server interface {
i()
// Start 启动 cron 服务
Start()
// Stop 停止 cron 服务
Stop()
// AddTask 增加定时任务
AddTask(task *cron_task_repo.CronTask)
// RemoveTask 删除定时任务
RemoveTask(taskId int)
// AddJob 增加定时任务执行的工作内容
AddJob(task *cron_task_repo.CronTask) cron.FuncJob
}
当调用 Start() 启动服务时,会把 MySQL 中的任务列表加载到调度器中。
通过以上方法,当从 WEB 界面 操作 新增、编辑、启用/禁用、手动执行任务时,可以动态的对调度器中的任务进行管理。
任务执行器
任务执行器指的是任务真实执行所在的机器。
我的思路是使用 Kafka 的发布与订阅功能,当调度器发现需要执行的任务时,将任务信息写到 Kafka 的 Topic 中,任务执行器订阅相关的 Topic 获取任务信息然后执行任务。
如果任务的执行方式为 HTTP,那么任务执行器可以为一组集群,专门处理调用 HTTP 任务,这里可以为一个消费组(Consumer Group),也可适具体场景而定。
如果任务的执行方式为 SHELL,那么任务执行器必须在脚本所在的宿主机上,这里可以为一个具体任务的消费者。
如果任务量过多,可以考虑根据业务场景多设置几个 Topic。
在项目中为了便于演示,不写入到 Kafka 中,仅记录了日志。
func (s *server) AddJob(task *cron_task_repo.CronTask) cron.FuncJob {
return func() {
s.taskCount.Add()
defer s.taskCount.Done()
msg := fmt.Sprintf("开始执行任务:(%d)%s [%s]", task.Id, task.Name, task.Spec)
s.logger.Info(msg)
}
}
日志目录:/logs/go-gin-api-cron.log。
小结
本文纯属抛砖引玉,有问题,欢迎批评指正。
go-gin-api 项目安装简单,开箱即用,创建一个后台任务试试吧。
推荐阅读
为开源项目 go-gin-api 增加后台任务模块的更多相关文章
- [ionic开源项目教程] - 第12讲 医疗模块的实现以及Service层loadMore和doRefresh的提取封装
关注微信订阅号:TongeBlog,可查看[ionic开源项目]全套教程. 这一讲主要实现tab2[医疗]模块,[医疗]模块跟tab1[健康]模块类似. [ionic开源项目教程] - 第12讲 医疗 ...
- Github Python计算器开源项目 二次开发--增加函数图形
先上原项目链接:https://github.com/xhf79/Calculator_pyqt python+Qt 开发的计算器 原项目界面和功能如图所示: 科学计算的内容基本都有,但按照项目的提示 ...
- [ionic开源项目教程] - 第9讲 新闻详情页的实现
目录 [ionic开源项目教程] 第1讲 前言,技术储备,环境搭建,常用命令 [ionic开源项目教程] 第2讲 新建项目,架构页面,配置app.js和controllers.js [ionic开源项 ...
- [ionic开源项目教程] - 手把手教你使用移动跨平台开发框架Ionic开发一个新闻阅读APP
前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. 关注订阅号:TongeBlog ,查看移动端跨平台 ...
- [ionic开源项目教程] - 第11讲 封装BaseController实现controller继承
关注微信订阅号:TongeBlog,可查看[ionic开源项目]全套教程. 截止到第10讲,tab1[健康]模块的功能基本已经完成了,但这一讲中,controller层又做了较大的改动,因为下一讲中t ...
- [ionic开源项目教程] - 第10讲 新闻详情页的用户体验优化
目录 [ionic开源项目教程] 第1讲 前言,技术储备,环境搭建,常用命令 [ionic开源项目教程] 第2讲 新建项目,架构页面,配置app.js和controllers.js [ionic开源项 ...
- 《云阅》一个仿网易云音乐UI,使用Gank.Io及豆瓣Api开发的开源项目
CloudReader 一款基于网易云音乐UI,使用GankIo及豆瓣api开发的符合Google Material Desgin阅读类的开源项目.项目采取的是Retrofit + RxJava + ...
- python实战===国内很简单实用的一些开源的api以及开源项目
原创 2017年03月25日 15:40:59 标签: api / 开源项目 / app / 免费接口 声明 以下所有 API 均由产品公司自身提供,本人皆从网络获取.获取与共享之行为或有侵犯产品 ...
- 瓣呀,一个基于豆瓣api仿网易云音乐的开源项目
整体采用material design 风格,本人是网易云音乐的粉丝,所以界面模仿了网页云音乐,另外,项目中尽量使用了5.0之后的新控件. 项目整体采用mvp+rxjava+retrofit 框架,使 ...
随机推荐
- golang可执行文件瘦身(缩小文件大小)
起因 golang部署起来极其遍历,但有时候希望对可执行文件进行瘦身(缩小文件大小) 尝试 情况允许情况下,交叉编译为32位 删除不必要的符号表.调试信息 尝试用对应平台的upx打压缩壳 解决 经过多 ...
- Pelles C编译时出现的“POLINK: fatal error: 拒绝访问”问题的一种可能成因
在使用PellesC编译程序时,第一遍能正常编译执行,第二遍就无法编译,出现以下问题提示: Building NEWprogram2.exe. POLINK: fatal error: 拒绝访问. * ...
- HashSet 和 HashMap 的比较
HashMap 和 HashSet 都是 collection 框架的一部分,它们让我们能够使用对象的集合.collection 框架有自己的接口和实现,主要分为 Set 接口,List 接口和 Qu ...
- react踩坑笔记
1.create-react-app中配置webpack // 方法一:将项目的配置文件抽取到项目中,即运行: npm run eject // 方法二:使用react-app-rewired 2.c ...
- 【LeetCode】841. 钥匙和房间
841. 钥匙和房间 知识点:图:递归 题目描述 有 N 个房间,开始时你位于 0 号房间.每个房间有不同的号码:0,1,2,...,N-1,并且房间里可能有一些钥匙能使你进入下一个房间. 在形式上, ...
- Jenkins(8080)未授权访问
下载地址http://mirrors.jenkins.io/debian/ 测试 浏览器访问http://localhost:8080/manage可以直接访问 点击脚本命令行 println &qu ...
- 电脑桌面与群晖NAS双向实时同步-20210105
电脑桌面与群晖NAS双向实时同步 2021年1月15日星期五 一.购买群晖DS920+网络存储服务器.NEC超轻笔记本电脑(重量小于800克).小米10至尊版安卓智能手机和intel i9 1 ...
- rsa加密初探
RSA加密算法初探 RSA加密算法是早期的非对称加密,公钥和私钥分离,公开公钥,通过确保私钥的安全来保证加密内容的安全.由麻省理工学院的罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi ...
- Nat Comm | 中科院动物所张勇团队合作揭示动物中DNA转座子介导基因重复的机制
1950年Barbara Mclintock 首次在玉米中发现转座子(TEs),并由此获得诺贝尔奖.尽管长期被认为是垃圾DNA,但现在TEs被广泛认可是宿主基因组演化的重要推动力.它们可引起包含基因重 ...
- 字节跳动已经10万人了?渣本双非Android程序员怎么上车?
字节跳动已经 10 万人了? 是的,在 2020 年字节跳动的员工总数从 6 万蹿到 10 万,平均每个工作日就有 150 人在办理入职,加入字节跳动全球超过 240 个办公点. 更有统计,在总部北京 ...