thisnthat преди 5 години
ревизия
f92b8d2ffb
променени са 1 файла, в които са добавени 99 реда и са изтрити 0 реда
  1. 99 0
      scheduler.go

+ 99 - 0
scheduler.go

@@ -0,0 +1,99 @@
+package scheduler
+
+import (
+	"sync"
+	"time"
+
+	log "github.com/Sirupsen/logrus"
+)
+
+type ScheduledJobConfig struct {
+	Task   func()
+	Period time.Duration
+	Name   string
+}
+
+func CreateJob(c ScheduledJobConfig) scheduledJob {
+	job := scheduledJob{}
+
+	job.task = c.Task
+	job.period = c.Period
+	job.name = c.Name
+	job.running = false
+	job.mux = &sync.Mutex{}
+	job.stopChannel = make(chan bool, 1)
+
+	return job
+}
+
+type scheduledJob struct {
+	task        func()
+	period      time.Duration
+	running     bool
+	name        string
+	stopChannel chan bool
+	mux         *sync.Mutex
+}
+
+func (s scheduledJob) run() {
+	logContext := log.WithFields(log.Fields{
+		"Func":    "Run()",
+		"package": "schedular",
+	})
+
+	//logContext := log.WithField("Func", "Run")
+	for {
+		select {
+		case <-time.After(s.period):
+		case <-s.stopChannel:
+			logContext.Debug("Closing Channel")
+			close(s.stopChannel)
+			s.running = false
+			return
+		}
+		logContext.Debug("Getting lock")
+		s.mux.Lock()
+		logContext.Debug("Log obtained")
+		logContext.Debug("Running Task")
+		s.task()
+		logContext.Debug("Releasing lock")
+		s.mux.Unlock()
+		logContext.Debug("Lock Released")
+	}
+}
+
+func (s scheduledJob) Start() {
+	logContext := log.WithFields(log.Fields{
+		"Func":    "Start()",
+		"package": "schedular",
+	})
+
+	logContext.Debug("Getting lock")
+	s.mux.Lock()
+	logContext.Debug("Log obtained")
+	s.running = true
+	logContext.Info("Starting Job")
+	go s.run()
+	logContext.Debug("Releasing lock")
+	s.mux.Unlock()
+	logContext.Debug("Lock Released")
+}
+
+func (s scheduledJob) Stop() {
+	logContext := log.WithFields(log.Fields{
+		"Func":    "Stop()",
+		"package": "schedular",
+	})
+
+	logContext.Debug("Getting lock")
+	s.mux.Lock()
+	logContext.Debug("Lock obtained")
+	s.stopChannel <- false
+	logContext.Info("Waiting on job to stop")
+	for s.running {
+	}
+	logContext.Info("Job as stopped")
+	logContext.Debug("Releasing lock")
+	s.mux.Unlock()
+	logContext.Debug("Lock Released")
+}