//启动MQ消息监听服务
//重连的实现方法
func (i *Listener) Start() (err error) {
i.done = make(chan interface{}, i.workerNum) //确认每个协程是否结束
rechan := make(chan interface{}, i.workerNum) //重连标识位
running := true
for k := 0; k < i.workerNum; k++ {
go ListenMsg(i.done, rechan, &running)
}
go reConnect(i, rechan) //启动重连协程
return nil
}
func ListenMsg(done chan<- interface{}, rechan chan<- interface{}, run *bool) {
defer done <- struct{}{}
msgs := Consume()
process := func() {
if *run == false {
return
}
msg, ok := <-msgs
if !ok {
*run = false
rechan <- struct{}{} //启动重连
}
//do something
}
for *run {
process()
}
}
func reConnect(i *Listener, rechan <-chan interface{}) {
<-rechan
//采用斐波那契数列的时间间隔来重连
for !i.closed {
err := i.Start()
if err != nil {
time.Sleep(fibonacci.time)
} else {
return
}
}
}
func (i *Listener) Close() {
//等待所有监听队列的协程结束
for i := 0; i < i.workerNum; i++ {
<-i.done
}
}