92 lines
1.3 KiB
Go
92 lines
1.3 KiB
Go
package task
|
|
|
|
import (
|
|
"fmt"
|
|
"samba/pkg/log"
|
|
"samba/pkg/service"
|
|
"time"
|
|
)
|
|
|
|
type Tasker interface {
|
|
Init(*Task)
|
|
Name() string
|
|
Do(*Task)
|
|
}
|
|
|
|
type task func(*Task)
|
|
|
|
type Task struct {
|
|
svr service.IService
|
|
// 执行次数
|
|
run int
|
|
|
|
// 任务名称
|
|
name string
|
|
// 执行时间间隔
|
|
dur time.Duration
|
|
// 执行次数
|
|
times int
|
|
// 执行函数
|
|
do task
|
|
// 是否停止
|
|
stop bool
|
|
// 是否固定配置
|
|
fixed bool
|
|
}
|
|
|
|
func (t *Task) Name() string {
|
|
return t.name
|
|
}
|
|
|
|
func (t *Task) AnyTimes() *Task {
|
|
return t.Times(-1)
|
|
}
|
|
|
|
func (t *Task) Times(v int) *Task {
|
|
if t.fixed {
|
|
return t
|
|
}
|
|
t.times = v
|
|
return t
|
|
}
|
|
|
|
func (t *Task) After(dur time.Duration) *Task {
|
|
if t.fixed {
|
|
return t
|
|
}
|
|
t.dur = dur
|
|
return t
|
|
}
|
|
|
|
func (t *Task) Ticker(dur time.Duration) *Task {
|
|
return t.AnyTimes().After(dur)
|
|
}
|
|
|
|
func (t *Task) Fixed() *Task {
|
|
t.fixed = true
|
|
return t
|
|
}
|
|
|
|
func (t *Task) Stop() {
|
|
t.stop = true
|
|
}
|
|
|
|
func (t *Task) submit() {
|
|
t.svr.NewTimer(t.dur, func() {
|
|
t.run++
|
|
log.Debug(fmt.Sprintf("任务:%v 开始执行", t.name))
|
|
t.do(t)
|
|
if t.times > 0 && t.run >= t.times {
|
|
log.Debug(fmt.Sprintf("任务:%v 已达到运行次数", t.name))
|
|
return
|
|
}
|
|
if t.stop {
|
|
log.Debug(fmt.Sprintf("任务:%v 已停止", t.name))
|
|
return
|
|
}
|
|
|
|
t.submit()
|
|
|
|
}, false)
|
|
}
|