using System; namespace ET.Server { public static class ActorHandleHelper { public static void Reply(int fromProcess, IActorResponse response) { if (fromProcess == Options.Instance.Process) // 返回消息是同一个进程 { // NetInnerComponent.Instance.HandleMessage(realActorId, response); 等同于直接调用下面这句 ActorMessageSenderComponent.Instance.HandleIActorResponse(response); return; } Session replySession = NetInnerComponent.Instance.Get(fromProcess); replySession.Send(response); } public static void HandleIActorResponse(IActorResponse response) { ActorMessageSenderComponent.Instance.HandleIActorResponse(response); } /// /// 分发actor消息 /// [EnableAccessEntiyChild] public static async ETTask HandleIActorRequest(long actorId, IActorRequest iActorRequest) { InstanceIdStruct instanceIdStruct = new(actorId); int fromProcess = instanceIdStruct.Process; instanceIdStruct.Process = Options.Instance.Process; long realActorId = instanceIdStruct.ToLong(); Entity entity = Root.Instance.Get(realActorId); if (entity == null) { IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor); Reply(fromProcess, response); return; } MailBoxComponent mailBoxComponent = entity.GetComponent(); if (mailBoxComponent == null) { Log.Warning($"actor not found mailbox: {entity.GetType().Name} {realActorId} {iActorRequest}"); IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor); Reply(fromProcess, response); return; } switch (mailBoxComponent.MailboxType) { case MailboxType.MessageDispatcher: { using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, realActorId)) { if (entity.InstanceId != realActorId) { IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor); Reply(fromProcess, response); break; } await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorRequest); } break; } case MailboxType.UnOrderMessageDispatcher: { await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorRequest); break; } case MailboxType.GateSession: default: throw new Exception($"no mailboxtype: {mailBoxComponent.MailboxType} {iActorRequest}"); } } /// /// 分发actor消息 /// [EnableAccessEntiyChild] public static async ETTask HandleIActorMessage(long actorId, IActorMessage iActorMessage) { InstanceIdStruct instanceIdStruct = new(actorId); int fromProcess = instanceIdStruct.Process; instanceIdStruct.Process = Options.Instance.Process; long realActorId = instanceIdStruct.ToLong(); Entity entity = Root.Instance.Get(realActorId); if (entity == null) { Log.Error($"not found actor: {realActorId} {iActorMessage}"); return; } MailBoxComponent mailBoxComponent = entity.GetComponent(); if (mailBoxComponent == null) { Log.Error($"actor not found mailbox: {entity.GetType().Name} {realActorId} {iActorMessage}"); return; } switch (mailBoxComponent.MailboxType) { case MailboxType.MessageDispatcher: { using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, realActorId)) { if (entity.InstanceId != realActorId) { break; } await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorMessage); } break; } case MailboxType.UnOrderMessageDispatcher: { await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorMessage); break; } case MailboxType.GateSession: { if (entity is Session gateSession) { // 发送给客户端 gateSession.Send(iActorMessage); } break; } default: throw new Exception($"no mailboxtype: {mailBoxComponent.MailboxType} {iActorMessage}"); } } } }