func (self *apnsPushService) pushListProcess(pool *connpool.Pool) { for push := range self.pushRet { if push.action == 1 { // add send finish mid p, ok := self.pushList[push.connId] if ok { self.pushList[push.connId].list = append(p.list, push.msgId) self.pushList[push.connId].timestamp = time.Now() } else { pushinfo := new(pushInfo) pushinfo.list = make([]uint32, 0) pushinfo.list = append(pushinfo.list, push.msgId) pushinfo.timestamp = time.Now() self.pushList[push.connId] = pushinfo } } else if push.action == 8 { // process mistack mid req, reqOk := self.midReqMap[push.msgId] if reqOk { req.fialPush++ } else { self.logChan <- NewInfof("act:8 find req fail, mid:%v cid:%v", push.msgId, push.connId) } pool.SetUnable(push.connId) _, ok := self.pushList[push.connId] if ok { flag := 0 for _, mid := range self.pushList[push.connId].list { self.cleanMap(self.midReqMap, self.midTokenMap, mid) flag++ if mid == push.msgId { break } } self.logChan <- NewInfof("receive unavailable token, mid:%v cid:%v, mid size:%v flag:%v", push.msgId, push.connId, len(self.pushList[push.connId].list), flag) self.pushList[push.connId].list = self.pushList[push.connId].list[flag:] } else { self.logChan <- NewInfof("pushList find cid err cid:%v mid:%v", push.connId, push.msgId) } } else if push.action == 0 { // process disconn conn _, ok := self.pushList[push.connId] if ok { if pool.IsUnable(push.connId) { if len(self.pushList[push.connId].list) > 0 { reSendToken := make([]*midTokenReq, 0) self.logChan <- NewInfof("resend size:%v cid:%v", len(self.pushList[push.connId].list), push.connId) for _, mid := range self.pushList[push.connId].list { token, tOk := self.midTokenMap[mid] if tOk { //self.logChan <- NewInfof("resend token:%v cid:%v ", hex.EncodeToString(token), push.connId) req, reqOk := self.midReqMap[mid] if reqOk { midtr := new(midTokenReq) midtr.mid = mid midtr.req = req midtr.token = token reSendToken = append(reSendToken, midtr) //go self.singlePush(req.payload, token, req.expiry, mid, pool) } else { self.logChan <- NewInfof("act:0 find req fail, mid:%v cid:%v", mid, push.connId) } } else { self.logChan <- NewInfof("find token err mid:%v cid:%v", mid, push.connId) } } go self.resendPush(reSendToken, pool) } } else { for _, mid := range self.pushList[push.connId].list { self.logChan <- NewInfof("abnormal conn, cid:%v mid:%v", push.connId, mid) self.cleanMap(self.midReqMap, self.midTokenMap, mid) } pool.SetUnable(push.connId) } delete(self.pushList, push.connId) } else { pool.SetUnable(push.connId) self.logChan <- NewInfof("find conn cid err, cid:%v mid:%v ", push.connId, push.msgId) } } else if push.action == 2 { // tick process pushList if pool.IsConn() == 0 { isTimeout := true for _, push := range self.pushList { if time.Now().Sub(push.timestamp) < time.Duration(self.apnstimeout)*time.Second { isTimeout = false break } } if isTimeout { for connId, push := range self.pushList { self.logChan <- NewInfof("conn free, conn size:%v cid:%v cid size:%v", len(self.pushList), connId, len(push.list)) for _, mid := range push.list { self.cleanMap(self.midReqMap, self.midTokenMap, mid) } delete(self.pushList, connId) } } } } else if push.action == 3 { // delete msg id req, reqOk := self.midReqMap[push.msgId] if reqOk { req.fialPush++ } else { self.logChan <- NewInfof("act:3 find req fail, mid:%v cid:%v", push.msgId, push.connId) } self.logChan <- NewInfof("mid:%v send fail cid:%v", push.msgId, push.connId) self.cleanMap(self.midReqMap, self.midTokenMap, push.msgId) } } }