func (s *Scheduler) LoadActionPlans(storage engine.RatingStorage) { actionPlans, err := storage.GetAllActionPlans() if err != nil && err != utils.ErrNotFound { utils.Logger.Warning(fmt.Sprintf("Cannot get action plans: %v", err)) } // recreate the queue s.Lock() s.queue = engine.ActionPlanPriotityList{} for key, aps := range actionPlans { toBeSaved := false isAsap := false newApls := make([]*engine.ActionPlan, 0) // will remove the one time runs from the database for _, ap := range aps { if ap.Timing == nil { utils.Logger.Warning(fmt.Sprintf("<Scheduler> Nil timing on action plan: %+v, discarding!", ap)) continue } isAsap = ap.IsASAP() toBeSaved = toBeSaved || isAsap if isAsap { if len(ap.AccountIds) > 0 { utils.Logger.Info(fmt.Sprintf("Time for one time action on %v", key)) } ap.Execute() ap.AccountIds = make([]string, 0) } else { now := time.Now() if ap.GetNextStartTime(now).Before(now) { // the task is obsolete, do not add it to the queue continue } s.queue = append(s.queue, ap) } // save even asap action plans with empty account id list newApls = append(newApls, ap) } if toBeSaved { engine.Guardian.Guard(func() (interface{}, error) { storage.SetActionPlans(key, newApls) storage.CacheRatingPrefixValues(map[string][]string{utils.ACTION_PLAN_PREFIX: []string{utils.ACTION_PLAN_PREFIX + key}}) return 0, nil }, 0, utils.ACTION_PLAN_PREFIX) } } sort.Sort(s.queue) s.Unlock() }
func (s *Scheduler) LoadActionPlans(storage engine.RatingStorage) { actionTimings, err := storage.GetAllActionPlans() if err != nil { engine.Logger.Warning(fmt.Sprintf("Cannot get action timings: %v", err)) } // recreate the queue s.Lock() s.queue = engine.ActionPlanPriotityList{} for key, ats := range actionTimings { toBeSaved := false isAsap := false newAts := make([]*engine.ActionPlan, 0) // will remove the one time runs from the database for _, at := range ats { isAsap = at.IsASAP() toBeSaved = toBeSaved || isAsap if isAsap { if len(at.AccountIds) > 0 { engine.Logger.Info(fmt.Sprintf("Time for one time action on %v", key)) } at.Execute() at.AccountIds = make([]string, 0) // do not append it to the newAts list to be saved } else { now := time.Now() if at.GetNextStartTime(now).Before(now) { // the task is obsolete, do not add it to the queue continue } s.queue = append(s.queue, at) } // save even asap action timings with empty account id list newAts = append(newAts, at) } if toBeSaved { engine.Guardian.Guard(func() (interface{}, error) { storage.SetActionPlans(key, newAts) return 0, nil }, 0, utils.ACTION_TIMING_PREFIX) } } sort.Sort(s.queue) s.Unlock() }