timer.go 1.1 KB

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