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() }