在学习NetInnerComponent时出现了InnerMessageDispatcher,这节先看InnerMessageDispatcher。这节涉及ActorMessageDispatcherComponent和Session。ActorMessageDispatcherComponent在这节基本所有方法都用过。
在NetInnerComponent的OnRead中,调用了InnerMessageDispatcher的Dispatch方法
InnerMessageDispatcher中只有Dispatch一个方法
先看开头, Packet.ActorIdIndex = 0, 刚好可以对应TChannel的Send方法中,标红那一段,得到actorId和操作码
然后往下看,这个是标记了SERVER宏也就是服务器
OpcodeTypeComponent.Instance.IsOutrActorMessage(opcode)判断是否为外网信息,并且是否继承了IActorMessage
通过计算得到realActorId去EventSystem去找到实体,如果没有实体通过操作码得到Type,生成报错信息message
如果这实体是Session那么设置stream位置并发送
然后继续往下看,通过操作码找到Type并将其反序列化,判断是否为IResponse并且不是IActorResponse,那么直接用Session读
上面执行了普通的IResponse
下面就是所有Message的执行,先看IActorRequest,有一个回调利用Session重新发送回去
InnerMessageDispatcherHelper.HandleIActorRequest摘选核心逻辑
从实体上面拿到mailBoxComponent这组件只有类型没有具体方法
而ActorMessageDispatcherComponent.Instance.Handle(entity, iActorRequest, reply);只是根据message类型去执行类型中Handle函数
IActorResponse类型
和上面一模一样执行了InnerMessageDispatcherHelper.HandleIActorResponse
InnerMessageDispatcherHelper.HandleIActorResponse,根据RpcId拿到发送者执行Run
public static void Run(ActorMessageSender self, IActorResponse response)
进行合法性判断,最后设置上面拿到的ActorMessageSender中Tcs(将会完成的任务)的结果
IActorMessage 执行了InnerMessageDispatcherHelper.HandleIActorMessage
InnerMessageDispatcherHelper.HandleIActorMessage 是不是发现和上面IActorResponse很像,只不过没有Reply。这个不需要Response的
最后就是普通的Message了