go执行定时任务

qii · · 7440 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

自己写的go定时器执行任务,欢迎拍砖。

package main

import (
	"fmt"
	"time"
   "bufio"
   "os"
   "strings"
   "errors"
   "io/ioutil"
   "strconv"
   "regexp"
   "net/http"
)

var taskList []*Task

type MyTimer struct{
   Config []map[string]interface{}
}

func NewMyTimer() *MyTimer{
   return &MyTimer{}
}

func (t *MyTimer) Start(){
   for _, v := range t.Config{
      //针对每个设置,启动任务
      myTask := NewTask(v)
      myTask.Start()
      taskList = append(taskList, myTask)
   }
   fmt.Println("---------- Timer Started ---------")
}

func (t *MyTimer) Stop(){
   for _, task := range taskList{
      task.Stop()
   }
   //清空task列表
   taskList = make([]*Task, 0)
   fmt.Println("--------- Timer Stoped ----------")
}

func (t *MyTimer) Restart(){
   t.Stop()
   t.Start()
   fmt.Println("-------- Timer Restarted ----------")
}

func (t *MyTimer) LoadConfigFile(fileName string) error{
   file,err:=os.Open(fileName)
   if nil!=err{
      return errors.New("config file load failed:"+fileName)
   }
   defer file.Close()
   config:=make([]map[string]interface{}, 0)
   content,ok:=ioutil.ReadAll(file)
   if ok!=nil{
      return errors.New("read config file error")
   }
   str:=string(content)
   reg:=regexp.MustCompile("[\r\n]+")
   array := reg.Split(str, -1)
   for _,val:=range array{
      //#;号开头的,作为注释
      if strings.HasPrefix(val, "#") || strings.HasPrefix(val, ";"){
         continue
      }
      if len(val) > 0{
         kv := strings.Split(val, "|")
         m:=make(map[string]interface{})
         m["url"] = kv[0]
         if len(kv) > 1{
            m["duration"], _ = strconv.Atoi(kv[1])
         } else {
            m["duration"] = 10
         }
         if len(kv) > 2{
            m["times"], _ = strconv.Atoi(kv[2])
         } else {
            m["times"] = 1
         }
         config = append(config, m)
      }
   }
   t.Config = config;
   return nil
}

type Task struct{
   Times int
   Duration int
   Url string
   Ch chan int
}

func NewTask(v map[string]interface{}) *Task{
   c:=make(chan int,1)
   return &Task{Times: v["times"].(int), Duration: v["duration"].(int), Url: v["url"].(string), Ch: c}
}

func (task *Task) Start(){
   timer := time.NewTicker(time.Duration(task.Duration) * time.Second)
   go func(c chan int){
      if task.Times == 0{
         forEnd1:
         for {
            select{
            case <- timer.C:
               http.Get(task.Url)
               fmt.Println("task request url: "+task.Url)
            case <-c:
               break forEnd1
            }
         }
      } else {
         forEnd2:
         for i := 0; i < task.Times; i ++{
            select{
            case <- timer.C:
               http.Get(task.Url)
               fmt.Println("task request url: "+task.Url)
            case <- c:
               break forEnd2
            }
         }
         //执行完成后,需要销毁计时器
         for k,v := range taskList{
            if v == task{
               if k == 0{
                  taskList = taskList[1:]
               } else if (k + 1) == len(taskList){
                  taskList = taskList[:k]
               } else {
                  taskList = append(taskList[k+1:], taskList[:k+2]...)
               }
               break
            }
         }
      }
   }(task.Ch)
}

func (task *Task) Stop(){
   task.Ch <- 1
   fmt.Println("---task stoped---")
}

func main() {
   //控制台输入
   reader:=bufio.NewReader(os.Stdin)

   timer:=NewMyTimer()
   ok:=timer.LoadConfigFile("config.txt")
   if ok!=nil{
      fmt.Println(ok)
      // panic("error")
   }
   for{
      fmt.Println("Enter a command :")
      rawLine,_,_:=reader.ReadLine()
      command:=string(rawLine)

      if "q" == command || "quit" == command{
         timer.Stop()
         fmt.Println("bye")
         break
      } else if "start" == command{
         timer.Start()
      } else if "stop" == command{
         timer.Stop()
      } else if "restart" == command {
         timer.Restart()
      } else if "help" == command {
         fmt.Println("****Welcome to use MyTimer****")
         fmt.Println("There is commands and options:")
         fmt.Println("start --start task jobs")
         fmt.Println("stop --stop task jobs")
         fmt.Println("restart --restart jobs")
         fmt.Println("quit --quit the job task, also can use short command q")
         fmt.Println("help --help infomation of MyTimer")
      } else {
         fmt.Println("Unknow command")
      }
   }
}

 


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:qii

查看原文:go执行定时任务

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

7440 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
上一篇:go环境配置
下一篇:go vendor
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传