Files
zeromesh/internal/task/task.go

51 lines
990 B
Go

package task
import (
"context"
"log/slog"
"time"
)
type Task struct {
Name string
Interval time.Duration
Handler func(ctx context.Context) error
}
type Scheduler struct {
tasks []Task
log *slog.Logger
}
func NewScheduler(log *slog.Logger) *Scheduler {
return &Scheduler{log: log.With("component", "scheduler")}
}
func (s *Scheduler) Add(name string, interval time.Duration, handler func(ctx context.Context) error) {
s.tasks = append(s.tasks, Task{
Name: name,
Interval: interval,
Handler: handler,
})
}
func (s *Scheduler) Start(ctx context.Context) {
for _, task := range s.tasks {
go func(t Task) {
ticker := time.NewTicker(t.Interval)
defer ticker.Stop()
s.log.Info("task started", "name", t.Name, "interval", t.Interval)
for {
select {
case <-ctx.Done():
return
case <-ticker.C:
if err := t.Handler(ctx); err != nil {
s.log.Error("task failed", "name", t.Name, "err", err)
}
}
}
}(task)
}
}