package rabbit import ( "errors" "time" ) type Publisher interface { Push(data []byte) error } type PubHandler struct { client *Client } func (p *PubHandler) Push(data []byte) error { p.client.mutex.Lock() if !p.client.isReady { p.client.mutex.Unlock() return errors.New("failed to push: not connected") } p.client.mutex.Unlock() for { err := p.client.unsafePush(data) if err != nil { p.client.logger.Println("Push failed. Retrying...") select { case <-p.client.done: return errShutdown case <-time.After(p.client.opts.resendDelay): } continue } confirm := <-p.client.notifyConfirm if confirm.Ack { p.client.logger.Printf("Push confirmed [%d]!", confirm.DeliveryTag) return nil } } }