为开源项目 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 框架,使 ...
随机推荐
- 如何在VeryCD中下载资源
这个方法也是百度来的,记在这里的目的不是为了显摆,主要是担心自己大脑记不住,用的时候又要重新找方法. 操作系统:Linux Mint 17 首先,在VeryCD中看好了某个资源,比如搜索的<哈利 ...
- 福昕foxit phantom pdf高级编辑器企业版10.1 pro安装破解教程
本文提供福昕foxit phantom pdf高级编辑器企业版10.1的安装教程.pj教程,可以使用全部功能,注意的是此方法对个人版无效. 没有必要再尝试别的文章,仅看这一篇即可!别的文章亲测是通过修 ...
- 理清 UT、UTC、GMT和CST
平时各种时间标准简写绕得不明不白,查一下整理在这里. IAT: International Atomic Time, 原子时.又称国际原子时,是一种通过原子钟得到的时间标准,原子钟是世界上已知最准确的 ...
- H5页面自动烟花特效
代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> ...
- 解决ModuleNotFoundError: No module named 'pip'问题
Python学习遇到小问题:ModuleNotFoundError: No module named 'pip' 今天想要装一下第三方库exifread的时候发现cmd窗口下无法执行pip命令,想了想 ...
- IOC(概念和原理)
什么是 IOC (1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理 (2)使用 IOC 目的:为了耦合度降低 (3)做入门案例就是 IOC 实现 IOC 底层原理 xml 解 ...
- Java代码搭建Dubbo+ZooKeeper 的示例
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- 操作系统思考 第十一章 C语言中的信号量
第十一章 C语言中的信号量 作者:Allen B. Downey 原文:Chapter 11 Semaphores in C 译者:飞龙 协议:CC BY-NC-SA 4.0 信号量是学习同步的一个好 ...
- Linux中DNS分离解析
目录 一.分离解析概述 二.DNS分离解析实验 要求 实验步骤 一.分离解析概述 分离解析:同一个dns服务器,同一个域名情况下,不同网段进行访问会解析出不同的IP地址 分离解析的域名服务器实际也是主 ...
- 课程设计- 基于ssm的捐赠物资分配管理系统 && 基于java的申请救援管理系统
课程设计- 基于ssm的捐赠物资分配管理系统 && 基于java的申请救援管理系统 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架: ...