12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- // suport cron like schedule tasks.
- package rule
- import (
- "fmt"
- "sparrow/pkg/models"
- "sparrow/pkg/rpcs"
- "sparrow/pkg/server"
- "time"
- "github.com/robfig/cron"
- )
- type Timer struct {
- c *cron.Cron
- }
- func NewTimer() *Timer {
- t := &Timer{}
- return t
- }
- func (t *Timer) createTimerFunc(target string, action string) func() {
- return func() {
- err := performRuleAction(target, action)
- if err != nil {
- server.Log.Warnf("timer action failed: %v", err)
- }
- }
- }
- func (t *Timer) refresh() {
- if t.c != nil {
- t.c.Stop()
- }
- t.c = cron.New()
- timers := &[]models.Rule{}
- query := &models.Rule{
- RuleType: "timer",
- }
- err := server.RPCCallByName(nil, rpcs.RegistryServerName, "Registry.QueryRules", query, timers)
- if err != nil {
- server.Log.Warnf("refresh timer rules error : %v", err)
- return
- }
- sec := fmt.Sprintf("%d ", (time.Now().Second()+30)%60)
- for _, one := range *timers {
- t.c.AddFunc(sec+one.Trigger, t.createTimerFunc(one.Target, one.Action))
- }
- t.c.Start()
- }
- func (t *Timer) Run() {
- go func() {
- for {
- t.refresh()
- time.Sleep(time.Minute)
- }
- }()
- }
|