40 lines
742 B
Go
40 lines
742 B
Go
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
|
|
}
|
|
}
|
|
}
|