123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- 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);
- }
-
- /// <summary>
- /// 分发actor消息
- /// </summary>
- [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<MailBoxComponent>();
- 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}");
- }
- }
-
- /// <summary>
- /// 分发actor消息
- /// </summary>
- [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<MailBoxComponent>();
- 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}");
- }
- }
- }
- }
|