timer.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // suport cron like schedule tasks.
  2. package rule
  3. import (
  4. "fmt"
  5. "sparrow/pkg/models"
  6. "sparrow/pkg/server"
  7. "github.com/robfig/cron"
  8. "time"
  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("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. }