task.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package server
  2. import (
  3. "context"
  4. "github.com/go-co-op/gocron"
  5. "github.com/go-nunu/nunu-layout-advanced/internal/task"
  6. "github.com/go-nunu/nunu-layout-advanced/pkg/log"
  7. "go.uber.org/zap"
  8. "time"
  9. )
  10. type TaskServer struct {
  11. log *log.Logger
  12. scheduler *gocron.Scheduler
  13. userTask task.UserTask
  14. }
  15. func NewTaskServer(
  16. log *log.Logger,
  17. userTask task.UserTask,
  18. ) *TaskServer {
  19. return &TaskServer{
  20. log: log,
  21. userTask: userTask,
  22. }
  23. }
  24. func (t *TaskServer) Start(ctx context.Context) error {
  25. gocron.SetPanicHandler(func(jobName string, recoverData interface{}) {
  26. t.log.Error("TaskServer Panic", zap.String("job", jobName), zap.Any("recover", recoverData))
  27. })
  28. // eg: crontab task
  29. t.scheduler = gocron.NewScheduler(time.UTC)
  30. // if you are in China, you will need to change the time zone as follows
  31. // t.scheduler = gocron.NewScheduler(time.FixedZone("PRC", 8*60*60))
  32. //_, err := t.scheduler.Every("3s").Do(func()
  33. _, err := t.scheduler.CronWithSeconds("0/3 * * * * *").Do(func() {
  34. err := t.userTask.CheckUser(ctx)
  35. if err != nil {
  36. t.log.Error("CheckUser error", zap.Error(err))
  37. }
  38. })
  39. if err != nil {
  40. t.log.Error("CheckUser error", zap.Error(err))
  41. }
  42. t.scheduler.StartBlocking()
  43. return nil
  44. }
  45. func (t *TaskServer) Stop(ctx context.Context) error {
  46. t.scheduler.Stop()
  47. t.log.Info("TaskServer stop...")
  48. return nil
  49. }