Exemple #1
0
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)
		}
	}
}