func Start(registry *registry.Registry) { glog.Infoln("Starting Queue Processor") registry.Queue = make(chan bool) client, err := posting.NewClient(registry) if err != nil { panic(err) } defer client.Close() if err = client.Initialise(); err != nil { panic(err) } db := registry.DB() defer db.Session.Close() queue := db.C("queue") registry.Routines.Add(1) var items QueueItemSlice for { start := time.Now() if err := queue.Find(bson.M{"status": "Queued"}).Sort("_id").Limit(10).All(&items); err != nil { panic(err) } for i, item := range items { if item.Command != items[0].Command { items = items[:i] break } } if err := items.Execute(registry, client); err != nil { glog.Errorln(err) } if len(items) > 0 { glog.Infof("Executed %d Queue items in %.2f secs", len(items), time.Now().Sub(start).Seconds()) continue } select { case <-registry.Queue: glog.Infoln("Queue Processor Stopped") registry.Routines.Done() return default: time.Sleep(time.Second) } } }