Esempio n. 1
0
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.")
		}
	}
}
Esempio n. 2
0
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
		}
	}
}