samba/pkg/task/task.go

92 lines
1.3 KiB
Go
Raw Normal View History

2025-06-04 09:51:39 +08:00
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)
}