timer.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // suport cron like schedule tasks.
  2. package rule
  3. import (
  4. "fmt"
  5. "sparrow/pkg/models"
  6. "sparrow/pkg/server"
  7. "time"
  8. "github.com/robfig/cron"
  9. )
  10. type Timer struct {
  11. c *cron.Cron
  12. }
  13. func NewTimer() *Timer {
  14. t := &Timer{}
  15. return t
  16. }
  17. func (t *Timer) createTimerFunc(target string, action string) func() {
  18. return func() {
  19. err := performRuleAction(target, action)
  20. if err != nil {
  21. server.Log.Warnf("timer action failed: %v", err)
  22. }
  23. }
  24. }
  25. func (t *Timer) refresh() {
  26. if t.c != nil {
  27. t.c.Stop()
  28. }
  29. t.c = cron.New()
  30. timers := &[]models.Rule{}
  31. query := &models.Rule{
  32. RuleType: "timer",
  33. }
  34. err := server.RPCCallByName(nil, "registry", "Registry.QueryRules", query, timers)
  35. if err != nil {
  36. server.Log.Warnf("refresh timer rules error : %v", err)
  37. return
  38. }
  39. sec := fmt.Sprintf("%d ", (time.Now().Second()+30)%60)
  40. for _, one := range *timers {
  41. t.c.AddFunc(sec+one.Trigger, t.createTimerFunc(one.Target, one.Action))
  42. }
  43. t.c.Start()
  44. }
  45. func (t *Timer) Run() {
  46. go func() {
  47. for {
  48. t.refresh()
  49. time.Sleep(time.Minute)
  50. }
  51. }()
  52. }