72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
package scheduler
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"time"
|
|
|
|
"git.ostiwe.com/ostiwe-com/status/modules/log"
|
|
"github.com/go-co-op/gocron/v2"
|
|
"github.com/google/uuid"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var GlobalAppScheduler AppScheduler
|
|
|
|
type AppScheduler interface {
|
|
NewServiceJob(serviceID uint64, jd gocron.JobDefinition, t gocron.Task, opt ...gocron.JobOption) (gocron.Job, error)
|
|
StartJobs() error
|
|
}
|
|
|
|
type appScheduler struct {
|
|
jobServiceMap map[uint64]uuid.UUID
|
|
scheduler gocron.Scheduler
|
|
logger *logrus.Logger
|
|
}
|
|
|
|
func NewAppScheduler() (AppScheduler, error) {
|
|
log.Global.Put(log.Scheduler, logrus.New())
|
|
|
|
location, err := time.LoadLocation(os.Getenv("APP_TZ"))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
scheduler, err := gocron.NewScheduler(gocron.WithLocation(location))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &appScheduler{
|
|
scheduler: scheduler,
|
|
logger: log.Global.Get(log.Scheduler),
|
|
jobServiceMap: make(map[uint64]uuid.UUID),
|
|
}, nil
|
|
}
|
|
|
|
func (s *appScheduler) NewServiceJob(
|
|
serviceID uint64,
|
|
jd gocron.JobDefinition,
|
|
t gocron.Task,
|
|
opt ...gocron.JobOption,
|
|
) (gocron.Job, error) {
|
|
job, err := s.scheduler.NewJob(jd, t, opt...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
s.jobServiceMap[serviceID] = job.ID()
|
|
|
|
return job, nil
|
|
}
|
|
|
|
func (s *appScheduler) StartJobs() error {
|
|
if s.scheduler == nil {
|
|
return errors.New("scheduler is nil")
|
|
}
|
|
|
|
s.scheduler.Start()
|
|
|
|
return nil
|
|
}
|