// Quit terminates the XMPP conversation so that new jobs stop arriving. func (x *XMPP) Quit() { // Signal to KeepXMPPAlive. close(x.quit) select { case <-x.dead: // Wait for XMPP to die. case <-time.After(3 * time.Second): // But not too long. log.Error("XMPP taking a while to close, so giving up") } }
// keepXMPPAlive restarts XMPP when it fails. func (x *XMPP) keepXMPPAlive() { for { select { case <-x.dead: log.Error("XMPP conversation died; restarting") if err := x.startXMPP(); err != nil { for err != nil { log.Errorf("XMPP restart failed, will try again in 10s: %s", err) time.Sleep(10 * time.Second) err = x.startXMPP() } log.Error("XMPP conversation restarted successfully") } case <-x.quit: // Close XMPP. x.ix.Quit() return } } }
func (pm *PrinterManager) syncPrintersPeriodically(interval time.Duration) { go func() { t := time.NewTimer(interval) defer t.Stop() for { select { case <-t.C: if err := pm.syncPrinters(false); err != nil { log.Error(err) } t.Reset(interval) case <-pm.quit: return } } }() }