public static void Check(this ActorMessageSenderComponent self) { long timeNow = TimeHelper.ServerNow(); foreach ((int key, ActorMessageSender value) in self.requestCallback) { // 因为是顺序发送的,所以,检测到第一个不超时的就退出 if (timeNow < value.CreateTime + ActorMessageSenderComponent.TIMEOUT_TIME) { break; } self.TimeoutActorMessageSenders.Add(key); } foreach (int rpcId in self.TimeoutActorMessageSenders) { ActorMessageSender actorMessageSender = self.requestCallback[rpcId]; self.requestCallback.Remove(rpcId); try { IActorResponse response = ActorHelper.CreateResponse((IActorRequest)actorMessageSender.MemoryStream.ToActorMessage(), ErrorCore.ERR_ActorTimeout); Run(actorMessageSender, response); } catch (Exception e) { Log.Error(e.ToString()); } } self.TimeoutActorMessageSenders.Clear(); }
public static async ETTask <IActorResponse> Call( this ActorMessageSenderComponent self, long actorId, int rpcId, MemoryStream memoryStream, bool needException = true ) { if (actorId == 0) { throw new Exception($"actor id is 0: {memoryStream.ToActorMessage()}"); } var tcs = ETTask <IActorResponse> .Create(true); self.requestCallback.Add(rpcId, new ActorMessageSender(actorId, memoryStream, tcs, needException)); self.Send(actorId, memoryStream); long beginTime = TimeHelper.ServerFrameTime(); IActorResponse response = await tcs; long endTime = TimeHelper.ServerFrameTime(); long costTime = endTime - beginTime; if (costTime > 200) { Log.Warning("actor rpc time > 200: {0} {1}", costTime, memoryStream.ToActorMessage()); } return(response); }
public static void Send(this ActorMessageSenderComponent self, long actorId, IMessage message) { if (actorId == 0) { throw new Exception($"actor id is 0: {message}"); } ProcessActorId processActorId = new ProcessActorId(actorId); Session session = NetInnerComponent.Instance.Get(processActorId.Process); session.Send(processActorId.ActorId, message); }
public static void RunMessage(this ActorMessageSenderComponent self, long actorId, IActorResponse response) { ActorMessageSender actorMessageSender; if (!self.requestCallback.TryGetValue(response.RpcId, out actorMessageSender)) { return; } self.requestCallback.Remove(response.RpcId); Run(actorMessageSender, response); }
public static async ETTask <IActorResponse> Call( this ActorMessageSenderComponent self, long actorId, IActorRequest request, bool needException = true ) { request.RpcId = self.GetRpcId(); if (actorId == 0) { throw new Exception($"actor id is 0: {request}"); } (ushort _, MemoryStream stream) = MessageSerializeHelper.MessageToStream(request); return(await self.Call(actorId, request.RpcId, stream, needException)); }
public static int GetRpcId(this ActorMessageSenderComponent self) { return(++self.RpcId); }