func (s *Scheduler) feedNextEvent() { for { nextTime, err := s.GetNextTime() if err != nil { msg.Logln(" feeder) Didn't find an event. Sleeping.") time.Sleep(time.Second) continue } msg.Logf(" feeder) Next event on %v\n", nextTime.Format(s.Stamp)) timer := time.AfterFunc(nextTime.Sub(time.Now()), func() { e, err := s.Pop() if err == nil { s.nextEvent <- e s.stopWaiting <- true } }) <-s.stopWaiting if timer.Stop() { msg.Logln(" feeder) Interrupted while waiting for current event.") } else { msg.Logln(" feeder) Current event completed.") } } }
func (s *Scheduler) ManageEventQueue() { go s.feedNextEvent() var err error // main loop for { // wait for the next event msg.Logln("\nmanager) Waiting for an event...") event := <-s.nextEvent msg.Logln("manager) Got one an event.") // Run the scheduled event if event.Action != nil { err = event.Action() if err != nil { fmt.Println(err) break } } else { msg.Logln("Event had no action") } // Update the next time for this event err = event.UpdateNextTime() if err != nil { fmt.Println(err) break } // Put this event back on the queue _, err = s.InsertInOrder(event) if err != nil { fmt.Println(err) break } } }