//启动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 } }
服务重连的实现方法
猜你喜欢
转载自www.cnblogs.com/share-ideas/p/11908388.html
今日推荐
周排行