task.go 1.2 KB

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