go 动态定时任务 API 接口

go 动态定时任务 API 接口

使用

  • 连接数据库表,启动服务 初始化所有定时任务,然后通过 API接口 动态修改 定时任务。
  • 数据库表
CREATE TABLE `go_cron` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `time` varchar(100) DEFAULT ‘‘ COMMENT ‘定时时间‘,
  `ip` varchar(100) DEFAULT ‘‘ COMMENT ‘内网IP‘,
  `shell` varchar(50) DEFAULT ‘‘ COMMENT ‘命令‘,
  `env` varchar(50) DEFAULT ‘‘ COMMENT ‘环境‘,
  `run` int(10)  DEFAULT ‘0‘ COMMENT ‘是否运行‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

代码

package main

import (
    "fmt"
    "github.com/Unknwon/com"
    "github.com/gin-gonic/gin"
    "github.com/gogf/gf/g/os/gcron"
    "github.com/gogf/gf/g/os/glog"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "strconv"
)

var db *gorm.DB

type Cron struct {
    ID        int    `gorm:"primary_key" json:"id"`
    Time      string `json:"time"`
    Ip        string `json:"ip"`
    Shell string `json:"shell"`
    Env       string `json:"env"`
    Run       int    `json:"run"`
}

func GetCron(id int) (user Cron) {
    db.Where("id = ?", id).First(&user)
    return
}

func GetCronAll() ([] *Cron) {
    var cron []*Cron
    db.Where("run = ?", 0).Find(&cron)
    return cron
}

func InitDb() {
    var err error
    db, err = gorm.Open("mysql", fmt.Sprintf("root:123456@tcp(192.168.100.50)/go?charset=utf8&parseTime=True&loc=Local", ))

    if err != nil {
        glog.Println(err)
    }

    gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
        return "go_" + defaultTableName
    }

    db.SingularTable(true)
    db.DB().SetMaxIdleConns(10)
    db.DB().SetMaxOpenConns(100)
}

func main() {
    InitDb()

    r := gin.Default()

    gc := gcron.New()
    data := GetCronAll()

    for _, v := range data {
        _, err := gc.Add(v.Time, func() { glog.Println(v.shell) }, strconv.Itoa(v.ID))
        if err != nil {
            fmt.Println("初始化定时任务错误 ",err)
        }
    }

    r.GET("/crons/:id", func(c *gin.Context) {
        id := com.StrTo(c.Param("id")).MustInt()
        run := com.StrTo(c.Query("run")).MustInt()
        if run == 0 {
            gc.Start(strconv.Itoa(id))
            glog.Println("启动", id)
            c.JSON(200, gin.H{
                "data": 0,
            })
        } else if run == 1 {
            glog.Println("关闭", id)
            gc.Stop(strconv.Itoa(id))
            c.JSON(200, gin.H{
                "data": 1,
            })
        } else {
            glog.Println("参数错误", id)
            c.JSON(400, gin.H{
                "data": "参数不对, 参数为 run=0/1",
            })
        }
    })

    r.POST("/crons/:id", func(c *gin.Context) {
        id := com.StrTo(c.Param("id")).MustInt()
        data := GetCron(id)
        _, err := gc.Add(data.Time, func() { glog.Println(data.shell) }, strconv.Itoa(data.ID))
        if err != nil {
            glog.Println("新增任务错误 ",err)
            c.JSON(400, gin.H{
                "data":err,
            })
        }else {
            glog.Println("新增任务 成功 ")
            c.JSON(200, gin.H{
                "data":0,
            })
        }
    })

    r.PUT("/crons/:id", func(c *gin.Context) {
        id := com.StrTo(c.Param("id")).MustInt()
        data := GetCron(id)
        gc.Stop(strconv.Itoa(id))
        gc.Remove(strconv.Itoa(id))
        _, err := gc.Add(data.Time, func() { glog.Println(data.shell) }, strconv.Itoa(data.ID))
        if err != nil {
            glog.Println("更新 任务错误 ",err)
            c.JSON(400, gin.H{
                "data":err,
            })
        }else {
            glog.Println("更新 任务 成功 ")
            c.JSON(200, gin.H{
                "data":0,
            })
        }
    })

    r.DELETE("/crons/:id", func (c *gin.Context) {
        id := com.StrTo(c.Param("id")).MustInt()

        fmt.Println(gc.Search(strconv.Itoa(id)))
        glog.Println("删除", id)
        gc.Stop(strconv.Itoa(id))
        fmt.Println(gc.Search(strconv.Itoa(id)))
        gc.Remove(strconv.Itoa(id))
        fmt.Println(gc.Search(strconv.Itoa(id)))

        err := gc.Search(strconv.Itoa(id))
        if err != nil {
            c.JSON(400, gin.H{
                "data": "删除成功",
            })
        }else {
            c.JSON(200, gin.H{
                "data": 0,
            })
        }

    })
    _ = r.Run("127.0.0.1:8080")
}

原文地址:https://blog.51cto.com/hequan/2372597

时间: 2024-11-05 20:29:04

go 动态定时任务 API 接口的相关文章

微信小程序的Web API接口设计及常见接口实现

微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示.在数据的关键 一环中,我们设计和编写Web API平台是非常重要的,通过这个我们可以实现数据的集中控制和管理,本篇随笔介绍基于Asp.NET MVC的Web API接口层的设计和常见接口代码的展示,以便展示我们常规Web API接口层的接口代码设计.参数的处理等内容. 1.Web API整体性的架构设计 我们整体性的架构设计

总结的一些微信API接口

本文给大家介绍的是个人总结的一些微信API接口,包括微信支付.微信红包.微信卡券.微信小店等,十分的全面,有需要的小伙伴可以参考下. 1. [代码]index.php <?php include_once 'lib.inc.php';   $wcObj = new WeChat("YOUKUIYUAN"); $wcObj->wcValid(); 2. [代码]微信入口类 <?php /**  * Description of wechat  *  * @author

C++传智笔记(6):socket客户端发送报文接受报文的api接口

#define _CRT_SECURE_NO_WARNINGS #include "stdio.h" #include "stdlib.h" #include "string.h" #include "itcast_comm.h" #include "memwatch.h" #include "itcastlog.h" /* 下面定义了一套socket客户端发送报文接受报文的api接口

基于http协议的api接口对于客户端的身份认证方式以及安全措施[转]

基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了. 但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好.所以一般情况我们都是需要客户端提供一个key(每个

ASP.NET ABP 之动态Web API层

建立动态Web API 控制器 ASP.NET Boilerplate 能够自动为您的应用层产生Web API层.比如说我们有如下的一个应用服务: 1 public interface ITaskAppService : IApplicationService 2 { 3 GetTasksOutput GetTasks(GetTasksInput input); 4 void UpdateTask(UpdateTaskInput input); 5 void CreateTask(CreateT

ABP官方文档翻译 5.2 动态We API层

动态Web APID层 创建动态Web API控制器 ForAll方法 重写ForAll ForMethods Http动词 WithVerb方法 HTTP特性 命名约定 API管理器 RemoteServie特性 动态Javascript代理 AJAX参数 单一服务脚本 Anaular集成 启用/禁用 包装结果 关于参数绑定 FormUrl和FormBody特性 DTOs对比原始类型 创建动态Web API控制器 这个文档是针对ASP.NET Web API的.如果你对ASP.NET Core

聊聊 PHP 与手机 APP 开发(API 接口开发)

对于新手开发api接口的一探讨 一.先简单回答两个问题: 1.PHP 可以开发客户端?答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:服务端的开发.(别去纠结 GTK.WinBinder) 2.为什么选择 PHP 作为开发服务端的首选?答:跨平台(可以运行在UNIX.LINUX.WINDOWS.Mac OS下).低消耗(PHP消耗相当少的系统资源).运行效率高(相对而言).MySQL的完美搭档,本身是免费开源的,...... 二.如何使用 PHP 开发 A

api接口对于客户端的身份认证方式以及安全措施

转载 基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了. 但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好.所以一般情况我们都是需要客户端提供一个key

【转】整套完整安全的API接口解决方案

原文地址:http://www.cnblogs.com/hubro/p/6248353.html 在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对于公开访问的接口,专业点的都会做下安全验证,数据签名之类 反而现在,谁都可以用WEB API估接口,安全性早忘一边了,特别是外包小公司的APP项目,80%都有安全漏洞(面试了大半年APP开发得出的结论)