gorabbitmq 筆記二 (確保消息成功發佈到rabitmq)

 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))
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章