1. 確認消息成功發佈到rabbitmq
SetConfirm函數
err := channel.Confirm(false)
if err != nil {
log.Println("this.Channel.Confirm ", err)
}
this.notifyConfirm = this.Channel.NotifyPublish(make(chan amqp.Confirmation))
這個函數會返回一個chan amqp.Confirmation的channel, 一般會把這個channel保存到自己實現的mq的結構體中,
type MQ struct {
//這個channel就是conn.Channel()
Channel *amqp.Channel
//確認發送到mq的channel
notifyConfirm chan amqp.Confirmation
//確認入列成功的channel
notifyReturn chan amqp.Return
}
確認消息監聽函數, 啓動一個協程,監聽消息發送情況
func (this *MQ)ListenConfirm(){
ret := <- this.notifyConfirm
if ret.Ack{
log.Println("confirm:消息發送成功")
} else{
//這裏表示消息發送到mq失敗,可以處理失敗流程
log.Println("confirm:消息發送失敗")
}
}
2. 確保消息入列成功
func (this *MQ)NotiryReturn(){
//前提需要設定Publish的mandatory爲true
this.notifyReturn=this.Channel.NotifyReturn(make(chan amqp.Return))
go this.listenReturn() //使用協程執行
}
//消息是否正確入列
func (this *MQ)listenReturn(){
ret:=<-this.notifyReturn
//這裏是OK使用延遲交換機, 如果沒有使用延遲交換機去掉_, ok :=ret.Headers["x-delay"] 和 if中的ok
_, ok :=ret.Headers["x-delay"]
if string(ret.Body)!="" && !ok {
log.Println("消息沒有正確入列:", string(ret.Body))
}
}