Files
novatask/internal/job/job.go
2024-12-19 21:14:14 +08:00

64 lines
1.1 KiB
Go

package job
import (
"context"
"errors"
"github.com/robfig/cron/v3"
"github.com/zeromicro/go-zero/core/logx"
"nova_task/internal/job/earn"
"nova_task/internal/job/pledge"
"nova_task/internal/svc"
)
type Job struct {
ctx context.Context
cancel context.CancelFunc
svcCtx *svc.ServiceContext
c *cron.Cron
}
type Spec interface {
Spec() string
}
func NewJob(svcCtx *svc.ServiceContext) *Job {
ctx, cancel := context.WithCancel(context.Background())
var cronList = []cron.Job{
earn.NewEarn(ctx, svcCtx),
pledge.NewPledge(ctx, svcCtx),
}
var err error
c := cron.New()
for _, cr := range cronList {
if cs, ok := cr.(Spec); ok {
_, err = c.AddJob(cs.Spec(), cr)
logx.Must(err)
continue
}
if cs, ok := cr.(cron.Schedule); ok {
c.Schedule(cs, cr)
continue
}
logx.Must(errors.New("cron job must implement either Spec or Schedule interface"))
}
return &Job{
ctx: ctx,
cancel: cancel,
svcCtx: svcCtx,
c: c,
}
}
func (j *Job) Start() {
logx.Info("start cron job")
j.c.Start()
}
func (j *Job) Stop() {
logx.Info("stop cron job")
<-j.c.Stop().Done()
logx.Info("cron job stopped")
j.cancel()
}