Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        public static async ETTask <IActorResponse> Call(this ActorLocationSenderComponent self, long entityId, IActorRequest iActorRequest)
        {
            ActorLocationSender actorLocationSender = self.GetOrCreate(entityId);

            // 先序列化好
            int rpcId = ActorMessageSenderComponent.Instance.GetRpcId();

            iActorRequest.RpcId             = rpcId;
            (ushort _, MemoryStream stream) = MessageSerializeHelper.MessageToStream(0, iActorRequest);

            long actorLocationSenderInstanceId = actorLocationSender.InstanceId;

            using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.ActorLocationSender, entityId))
            {
                if (actorLocationSender.InstanceId != actorLocationSenderInstanceId)
                {
                    throw new RpcException(ErrorCore.ERR_ActorTimeout, $"{stream.ToActorMessage()}");
                }

                // 队列中没处理的消息返回跟上个消息一样的报错
                if (actorLocationSender.Error == ErrorCore.ERR_NotFoundActor)
                {
                    return(ActorHelper.CreateResponse(iActorRequest, actorLocationSender.Error));
                }

                try
                {
                    return(await self.CallInner(actorLocationSender, rpcId, stream));
                }
                catch (RpcException)
                {
                    self.Remove(actorLocationSender.Id);
                    throw;
                }
                catch (Exception e)
                {
                    self.Remove(actorLocationSender.Id);
                    throw new Exception($"{stream.ToActorMessage()}", e);
                }
            }
        }
Ejemplo n.º 3
0
        public void Send(IMessage message)
        {
            switch (this.AService.ServiceType)
            {
            case ServiceType.Inner:
            {
                (ushort opcode, MemoryStream stream) = MessageSerializeHelper.MessageToStream(0, message);
                OpcodeHelper.LogMsg(this.DomainZone(), opcode, message);
                this.Send(0, stream);
                break;
            }

            case ServiceType.Outer:
            {
                (ushort opcode, MemoryStream stream) = MessageSerializeHelper.MessageToStream(message);
                OpcodeHelper.LogMsg(this.DomainZone(), opcode, message);
                this.Send(0, stream);
                break;
            }
            }
        }
Ejemplo n.º 4
0
 public void Send(long actorId, IMessage message)
 {
     (ushort opcode, MemoryStream stream) = MessageSerializeHelper.MessageToStream(actorId, message);
     OpcodeHelper.LogMsg(this.DomainZone(), opcode, message);
     this.Send(actorId, stream);
 }
Ejemplo n.º 5
0
 public static void Send(this Session self, long actorId, IMessage message)
 {
     (ushort opcode, MemoryStream stream) = MessageSerializeHelper.MessageToStream(message);
     OpcodeHelper.LogMsg(self.DomainZone(), opcode, message);
     self.Send(actorId, stream);
 }