//接受错误的响应并触发重发 func (self *ApnsClient) onErrorResponseRecieve(responseChannel chan *entry.Response) { //获取响应并且触发重发操作 var resp *entry.Response ch := make(chan *entry.Message, 100) for self.running { //顺序处理每一个连接的错误数据发送 resp = <-responseChannel //只有 prcessing error 和 shutdown的两种id才会进行重发 switch resp.Status { case entry.RESP_SHUTDOWN, entry.RESP_ERROR, entry.RESP_UNKNOW: //只有这三种才重发 self.resend(ch, resp.Identifier, func(id uint32, msg *entry.Message) bool { expiredTime := int64(entry.UmarshalExpiredTime(msg)) //过滤掉 不是当前连接ID的消息 或者 当前相同ID的消息 或者 (有过期时间结果已经过期的消息) return msg.ProcessId != resp.ProccessId || id == resp.Identifier || (0 != expiredTime && (time.Now().Unix()-expiredTime >= 0)) }) case entry.RESP_INVALID_TOKEN, entry.RESP_INVALID_TOKEN_SIZE: //将错误的token记录在存储中,备后续的过滤使用 msg := self.storage.Get(resp.Identifier) //从msg中拿出token用于记录 token := entry.UmarshalToken(msg) self.storeInvalidToken(token) } } }
//接受错误的响应并触发重发 func (self *ApnsClient) onErrorResponseRecieve(responseChannel chan *entry.Response) { ch := make(chan *entry.Message, 1000) //启动重发任务 go self.resend(ch) //开始启动 for self.running { //顺序处理每一个连接的错误数据发送 resp := <-responseChannel //只有 prcessing error 和 shutdown的两种id才会进行重发 switch resp.Status { case entry.RESP_SHUTDOWN, entry.RESP_ERROR, entry.RESP_UNKNOW: //只有这三种才重发 ch := self.storage.Remove(resp.Identifier, 0, func(id uint32, msg *entry.Message) bool { expiredTime := int64(entry.UmarshalExpiredTime(msg)) //过滤掉 不是当前连接ID的消息 或者 当前相同ID的消息 或者 (有过期时间结果已经过期的消息) return msg.ProcessId != resp.ProccessId || id == resp.Identifier || (0 != expiredTime && (time.Now().Unix()-expiredTime >= 0)) }) for { tmp := <-ch //如果删除成功并且消息不为空则重发 if nil != tmp { ch <- tmp } else { break } } log.InfoLog("push_client", "APNSCLIENT|onErrorResponseRecieve|ERROR|%d", resp.Status) case entry.RESP_INVALID_TOKEN, entry.RESP_INVALID_TOKEN_SIZE: //将错误的token记录在存储中,备后续的过滤使用 msg := self.storage.Get(resp.Identifier) if nil != msg { //从msg中拿出token用于记录 token := entry.UmarshalToken(msg) self.storeInvalidToken(token) log.InfoLog("push_client", "APNSCLIENT|INVALID TOKEN|%s", resp.Identifier) } } } }