sysmonitord/internal/monitor/timer/timer.go
2026-04-03 08:32:57 +08:00

65 lines
1.4 KiB
Go

package timer
import (
"sync"
"sysmonitord/pkg/logger"
"time"
"go.uber.org/zap"
)
type Job interface {
Run() error
Name() string
}
type Scheduler struct {
ticker *time.Ticker
stopCh chan struct{}
job Job
wg sync.WaitGroup
interval time.Duration
}
func NewScheduler(interval time.Duration, job Job) *Scheduler {
return &Scheduler{
ticker: time.NewTicker(interval),
stopCh: make(chan struct{}),
job: job,
interval: interval,
}
}
func (s *Scheduler) Start() {
logger.Log.Info("[monitor] 定时任务已启动", zap.String("job", s.job.Name()), zap.Duration("interval", s.interval))
s.wg.Add(1)
go func() {
defer s.wg.Done()
logger.Log.Info("[monitor] 执行定时任务", zap.String("job", s.job.Name()))
if err := s.job.Run(); err != nil {
logger.Log.Error("[monitor] 定时任务执行失败", zap.String("job", s.job.Name()), zap.Error(err))
}
for {
select {
case <-s.ticker.C:
logger.Log.Info("[monitor] 执行定时任务", zap.String("job", s.job.Name()))
if err := s.job.Run(); err != nil {
logger.Log.Error("[monitor] 定时任务执行失败", zap.String("job", s.job.Name()), zap.Error(err))
}
case <-s.stopCh:
logger.Log.Info("[monitor] 定时任务已停止", zap.String("job", s.job.Name()))
return
}
}
}()
}
func (s *Scheduler) Stop() {
close(s.stopCh)
s.ticker.Stop()
s.wg.Wait()
}