private void OnSaveReply(Msg_DL_SaveResult msg, PBChannel channel, int src, uint session) { KeyString key = KeyString.Wrap(msg.PrimaryKeys); ConcurrentDictionary <KeyString, ConcurrentQueue <SaveRequestInfo> > dict; if (m_SaveRequestQueues.TryGetValue(msg.MsgId, out dict)) { ConcurrentQueue <SaveRequestInfo> reqQueue; if (dict.TryGetValue(key, out reqQueue)) { SaveRequestInfo info; if (reqQueue.TryPeek(out info)) { if (info.m_Request.SerialNo == msg.SerialNo) { if (null != info.m_Callback) { info.m_Callback(msg); } SaveRequestInfo delInfo; if (reqQueue.TryDequeue(out delInfo)) { m_SaveRequestPool.Recycle(delInfo); } //发送队列中的下一个消息 if (reqQueue.TryPeek(out info)) { info.m_LastSendTime = TimeUtility.GetLocalMilliseconds(); m_DataStoreChannel.Send(info.m_Request); } } } } } }
private void DSSaveHandler(Msg_LD_Save msg, PBChannel channel, int handle, uint seq) { var saveResult = new Msg_DL_SaveResult(); saveResult.MsgId = msg.MsgId; saveResult.PrimaryKeys.AddRange(msg.PrimaryKeys); saveResult.SerialNo = msg.SerialNo; saveResult.ErrorNo = Msg_DL_SaveResult.ErrorNoEnum.Success; saveResult.ErrorInfo = string.Empty; try { //写入数据缓存 //TODO:是否将byte[]解析出protobuf对象? 提前反序列化成对象的好处:1.若数据有错误,反序列化失败,可反馈给lobby;2.protobuf对象可重用? //TODO:解析primaryKey和foreignKey DataCacheSystem.Instance.SaveActionQueue.QueueAction(DataCacheSystem.Instance.Save, msg.MsgId, msg.PrimaryKeys, msg.ForeignKeys, msg.Data, msg.SerialNo); } catch (Exception e) { saveResult.ErrorNo = Msg_DL_SaveResult.ErrorNoEnum.PostError; saveResult.ErrorInfo = e.Message; LogSys.Log(LOG_TYPE.ERROR, "Save data ERROR: MsgId:{0}, Key:{1}, Error:{2}, Detail:{3}", msg.MsgId, msg.PrimaryKeys, e.Message, e.StackTrace); } channel.Send(saveResult); }