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) }