应用退出时,清空定时任务

pull/21/merge
ouqiang 2017-04-06 14:40:48 +08:00
parent c25e4f9e61
commit b3b926fcbd
4 changed files with 27 additions and 19 deletions

View File

@ -1,15 +1,9 @@
language: go language: go
go: go:
- 1.5.x - 1.5.x
- 1.6.x - 1.6.x
- 1.7.x - 1.7.x
- 1.8.x - 1.8.x
- master - master
env: env:
- GO15VENDOREXPERIMENT=1 - GO15VENDOREXPERIMENT=1
os:
- linux
- osx

View File

@ -14,8 +14,10 @@ import (
"os/exec" "os/exec"
"syscall" "syscall"
"github.com/ouqiang/cron-scheduler/modules/logger" "github.com/ouqiang/cron-scheduler/modules/logger"
"github.com/ouqiang/cron-scheduler/modules/crontask"
) )
// 1号进程id
const InitProcess = 1 const InitProcess = 1
// web服务器默认端口 // web服务器默认端口
@ -56,7 +58,6 @@ func run(ctx *cli.Context) {
app.InitEnv() app.InitEnv()
// 捕捉信号,配置热更新等 // 捕捉信号,配置热更新等
go catchSignal() go catchSignal()
m := macaron.Classic() m := macaron.Classic()
// 注册路由 // 注册路由
routers.Register(m) routers.Register(m)
@ -115,17 +116,16 @@ func setEnvironment(ctx *cli.Context) {
// 捕捉信号 // 捕捉信号
func catchSignal() { func catchSignal() {
c := make(chan os.Signal) c := make(chan os.Signal)
signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, // todo 配置热更新, windows 不支持 syscall.SIGUSR1, syscall.SIGUSR2
syscall.SIGUSR1, syscall.SIGUSR2) signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
for { for {
s := <- c s := <- c
logger.Info("收到信号 -- ", s) logger.Info("收到信号 -- ", s)
switch s { switch s {
case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM: case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM:
// 清理资源, 准备退出 // 删除所有任务
crontask.DefaultCronTask.DeleteAll()
os.Exit(1) os.Exit(1)
case syscall.SIGUSR1, syscall.SIGUSR2:
// 热更新
} }
} }
} }
@ -141,7 +141,7 @@ func becomeDaemon(ctx *cli.Context) {
if os.Getppid() == InitProcess { if os.Getppid() == InitProcess {
// 子进程不再处理 // 已是守护进程,不再处理
return return
} }

View File

@ -54,7 +54,7 @@ func (cronTask *CronTask) Add(name string, spec string, cmd cron.FuncJob) (err e
} }
// 任务不存在则新增,任务已存在则删除后新增 // 任务不存在则新增,任务已存在则删除后新增
func (cronTask *CronTask) AddOrReplace(name string, spec string, cmd cron.FuncJob) error { func (cronTask *CronTask) Update(name string, spec string, cmd cron.FuncJob) error {
if cronTask.IsExist(name) { if cronTask.IsExist(name) {
cronTask.Delete(name) cronTask.Delete(name)
} }
@ -85,3 +85,10 @@ func (cronTask *CronTask) Delete(name string) {
defer cronTask.Unlock() defer cronTask.Unlock()
delete(cronTask.tasks, name) delete(cronTask.tasks, name)
} }
// 删除所有任务
func(cronTask *CronTask) DeleteAll() {
for taskName, _ := range(cronTask.tasks) {
cronTask.Delete(taskName)
}
}

View File

@ -40,7 +40,7 @@ func (task *Task) Add(taskModel models.Task) {
} }
// 定时任务 // 定时任务
if taskModel.Type == models.Timing { if taskModel.Type == models.Timing {
err := crontask.DefaultCronTask.AddOrReplace(strconv.Itoa(taskModel.Id), taskModel.Spec, taskFunc) err := crontask.DefaultCronTask.Update(strconv.Itoa(taskModel.Id), taskModel.Spec, taskFunc)
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
} }
@ -120,9 +120,16 @@ func execSSHHandler(module string, taskModel models.Task) (string, error) {
return "", nil return "", nil
} }
func createTaskLog(taskId int) (int, error) { func createTaskLog(taskModel models.Task) (int, error) {
taskLogModel := new(models.TaskLog) taskLogModel := new(models.TaskLog)
taskLogModel.TaskId = taskId taskLogModel.Name = taskModel.Name
taskLogModel.Spec = taskModel.Spec
taskLogModel.Protocol = taskModel.Protocol
taskLogModel.Type = taskModel.Type
taskLogModel.Command = taskModel.Command
taskLogModel.Timeout = taskModel.Timeout
taskLogModel.Delay = taskModel.Delay
taskLogModel.SshHosts = taskModel.SshHosts
taskLogModel.StartTime = time.Now() taskLogModel.StartTime = time.Now()
taskLogModel.Status = models.Running taskLogModel.Status = models.Running
insertId, err := taskLogModel.Create() insertId, err := taskLogModel.Create()
@ -160,7 +167,7 @@ func createHandlerJob(taskModel models.Task) cron.FuncJob {
return nil return nil
} }
taskFunc := func() { taskFunc := func() {
taskLogId, err := createTaskLog(taskModel.Id) taskLogId, err := createTaskLog(taskModel)
if err != nil { if err != nil {
logger.Error("写入任务日志失败-", err) logger.Error("写入任务日志失败-", err)
return return