Example #1
0
        public static async void UpdateAsync(this ActorMessageSender self)
        {
            try
            {
                while (true)
                {
                    ActorTask actorTask = await self.GetAsync();

                    if (self.IsDisposed)
                    {
                        return;
                    }

                    if (actorTask.ActorMessage == null)
                    {
                        return;
                    }

                    await self.RunTask(actorTask);
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
        public static async void UpdateAsync(this ActorLocationSender self)
        {
            try
            {
                long instanceId = self.InstanceId;
                while (true)
                {
                    if (self.InstanceId != instanceId)
                    {
                        return;
                    }
                    ActorTask actorTask = await self.GetAsync();

                    if (self.InstanceId != instanceId)
                    {
                        return;
                    }
                    if (actorTask.ActorRequest == null)
                    {
                        return;
                    }

                    await self.RunTask(actorTask);
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
Example #3
0
        /// <summary>
        /// 处理发送消息
        /// </summary>
        /// <param name="self"></param>
        /// <param name="task"></param>
        /// <returns></returns>
        private static async Task RunTask(this ActorLocationSender self, ActorTask task)
        {
            //获得和其他服务器通讯的会话
            ActorMessageSender actorMessageSender = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(self.ActorId);
            //发送一个rpc消息
            IActorResponse response = await actorMessageSender.Call(task.ActorRequest);

            // 发送成功
            switch (response.Error)
            {
            case ErrorCode.ERR_NotFoundActor:
                // 如果没找到Actor,重试
                ++self.FailTimes;

                // 失败MaxFailTimes次则清空actor发送队列,返回失败
                if (self.FailTimes > ActorLocationSender.MaxFailTimes)
                {
                    // 失败直接删除actorproxy
                    Log.Info($"actor send message fail, actorid: {self.Id}");
                    self.RunError(response.Error);
                    self.GetParent <ActorLocationSenderComponent>().Remove(self.Id);                           //从字典中移除这个会话通道
                    return;
                }

                // 等待0.5s再发送
                await Game.Scene.GetComponent <TimerComponent>().WaitAsync(500);

                self.ActorId = await Game.Scene.GetComponent <LocationProxyComponent>().Get(self.Id);                        //重新获得map服务器地址

                self.Address = StartConfigComponent.Instance
                               .Get(IdGenerater.GetAppIdFromId(self.ActorId))
                               .GetComponent <InnerConfig>().IPEndPoint;                         //得到IP
                self.AllowGet();
                return;

            case ErrorCode.ERR_ActorNoMailBoxComponent:
                self.RunError(response.Error);
                self.GetParent <ActorLocationSenderComponent>().Remove(self.Id);
                return;

            default:                                  //发送成功
                self.LastSendTime = TimeHelper.Now(); //记录最后发送时间
                self.FailTimes    = 0;
                self.WaitingTasks.Dequeue();          //出栈

                if (task.Tcs == null)
                {
                    return;
                }

                IActorLocationResponse actorLocationResponse = response as IActorLocationResponse;
                if (actorLocationResponse == null)
                {
                    task.Tcs.SetException(new Exception($"actor location respose is not IActorLocationResponse, but is: {response.GetType().Name}"));
                }
                task.Tcs.SetResult(actorLocationResponse);                          //返回PRC消息回应
                return;
            }
        }
    public override ActorTask GetTask(Actor entity)
    {
        ActorTask tmp = PendingTask;

        PendingTask = null;

        return(tmp);
    }
Example #5
0
        public static Task <IResponse> Call(this ActorMessageSender self, IActorRequest request)
        {
            TaskCompletionSource <IResponse> tcs = new TaskCompletionSource <IResponse>();
            ActorTask task = new ActorTask(request, tcs);

            self.Add(task);
            return(task.Tcs.Task);
        }
Example #6
0
        public static void Send(this ActorProxy self, IActorMessage message)
        {
            ActorTask task = new ActorTask {
                message = message, proxy = self
            };

            self.Add(task);
        }
Example #7
0
        private static async ETTask RunTask(this ActorLocationSender self, ActorTask task)
        {
            ActorMessageSender actorMessageSender = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(self.ActorId);
            IActorResponse     response           = await actorMessageSender.Call(task.ActorRequest);

            // 发送成功
            switch (response.Error)
            {
            case ErrorCode.ERR_NotFoundActor:
                // 如果没找到Actor,重试
                ++self.FailTimes;

                // 失败MaxFailTimes次则清空actor发送队列,返回失败
                if (self.FailTimes > ActorLocationSender.MaxFailTimes)
                {
                    // 失败直接删除actorproxy
                    Log.Info($"actor send message fail, actorid: {self.Id}");
                    self.RunError(response.Error);
                    self.GetParent <ActorLocationSenderComponent>().Remove(self.Id);
                    return;
                }

                // 等待0.5s再发送
                await Game.Scene.GetComponent <TimerComponent>().WaitAsync(500);

                self.ActorId = await Game.Scene.GetComponent <LocationProxyComponent>().Get(self.Id);

                self.AllowGet();
                return;

            case ErrorCode.ERR_ActorNoMailBoxComponent:
                self.RunError(response.Error);
                self.GetParent <ActorLocationSenderComponent>().Remove(self.Id);
                return;

            default:
                self.LastRecvTime = TimeHelper.Now();
                self.FailTimes    = 0;
                self.WaitingTasks.Dequeue();

                // 如果所有的发送消息都得到了返回,发送任务完成,那么删除这个ActorLocationSender,及时回收发送对象
                if (self.WaitingTasks.Count == 0)
                {
                    self.GetParent <ActorLocationSenderComponent>().Remove(self.Id);
                }

                if (task.Tcs != null)
                {
                    IActorLocationResponse actorLocationResponse = response as IActorLocationResponse;
                    if (actorLocationResponse == null)
                    {
                        task.Tcs.SetException(new Exception($"actor location respose is not IActorLocationResponse, but is: {response.GetType().Name}"));
                    }
                    task.Tcs.SetResult(actorLocationResponse);
                }
                return;
            }
        }
Example #8
0
        public static Task <IResponse> Call(this ActorProxy self, IActorRequest request)
        {
            ActorTask task = new ActorTask {
                message = request, proxy = self, Tcs = new TaskCompletionSource <IResponse>()
            };

            self.Add(task);
            return(task.Tcs.Task);
        }
        private void DoParser(IActor anActor)
        {
            List <String> aList = new List <String>();

            aList.Add(ActorTask.Stat());
            var lParser = new ParserActor();

            lParser.SendMessage(aList.AsEnumerable <String>(), anActor);
        }
 public static void RunError(this ActorLocationSender self, int errorCode)
 {
     while (self.WaitingTasks.Count > 0)
     {
         ActorTask actorTask = self.WaitingTasks.Dequeue();
         actorTask.Tcs?.SetException(new RpcException(errorCode, ""));
     }
     self.WaitingTasks.Clear();
 }
 private void SettingEvent()
 {
     ServiceManager.EventService.GameObjectClick += (data) => {
         if (data.MouseButton == MouseButton.Rigth)
         {
             PendingTask = Task.Create <ActorTaskMoveTo>().Assign(data.ClickPoint);
         }
     };
 }
        private static async Task RunTask(this ActorMessageSender self, ActorTask task)
        {
            Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(null);

            //Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(self.Address);

            task.ActorMessage.ActorId = self.ActorId;
            IResponse response = await session.Call(task.ActorMessage);

            Log.Debug("runTask:" + task.ActorMessage.GetType().FullName);
            Log.Debug("runTask1:" + response.Tag);


            // 发送成功
            switch (response.Tag)
            {
            case ErrorCode.ERR_NotFoundActor:
                // 如果没找到Actor,重试
                ++self.FailTimes;

                // 失败MaxFailTimes次则清空actor发送队列,返回失败
                if (self.FailTimes > self.MaxFailTimes)
                {
                    // 失败直接删除actorproxy
                    Log.Info($"actor send message fail, actorid: {self.Id}");
                    self.Error = response.Tag;
                    self.GetParent <ActorMessageSenderComponent>().Remove(self.Id);
                    return;
                }

                // 等待1s再发送
                await Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000);

                //self.ActorId = await Game.Scene.GetComponent<LocationProxyComponent>().Get(self.Id);
                //self.Address = Game.Scene.GetComponent<StartConfigComponent>()
                //		.Get(IdGenerater.GetAppIdFromId(self.ActorId))
                //		.GetComponent<InnerConfig>().IPEndPoint;
                self.AllowGet();
                return;

            case ErrorCode.ERR_ActorNoMailBoxComponent:
                self.Error = response.Tag;
                self.GetParent <ActorMessageSenderComponent>().Remove(self.Id);
                return;

            default:
                self.LastSendTime = TimeHelper.Now();
                self.FailTimes    = 0;

                self.WaitingTasks.Dequeue();

                task.Tcs?.SetResult(response);

                return;
            }
        }
Example #13
0
        public static void Send(this ActorMessageSender self, IActorMessage message)
        {
            if (message == null)
            {
                throw new Exception($"actor send message is null");
            }
            ActorTask task = new ActorTask(message);

            self.Add(task);
        }
Example #14
0
        private void DoParser()
        {
            List <String> aList = new List <String>();

            aList.Add(ActorTask.Stat());
            var lParser = new ParserActor();

            new EchoActor <IEnumerable <string> >(lParser, aList);
            lParser.SendMessage(aList.AsEnumerable <String>());
        }
        public static void Send(this ActorLocationSender self, IActorLocationMessage request)
        {
            if (request == null)
            {
                throw new Exception($"actor location send message is null");
            }
            ActorTask task = new ActorTask(request);

            self.Add(task);
        }
Example #16
0
    public override void Process(Task task)
    {
        base.Process(task);

        ActorTask actorTask = task as ActorTask;

        if (actorTask != null)
        {
            SetTask(actorTask);
        }
    }
Example #17
0
        /// <summary>
        /// 从队列里面取出一个消息进行处理
        /// </summary>
        /// <param name="self"></param>
        /// <returns></returns>
        private static Task <ActorTask> GetAsync(this ActorLocationSender self)
        {
            if (self.WaitingTasks.Count > 0)
            {
                ActorTask task = self.WaitingTasks.Peek();
                return(Task.FromResult(task));                  //创建一个带返回值的、已完成的异步任务,其参数是取出的Task。
            }

            self.Tcs = new TaskCompletionSource <ActorTask>(); //如果棧里面有消息 这里是不会执行的,只有当站里面没有消息,程序就会在这里等待 知道加入了新的消息 继续
            return(self.Tcs.Task);                             //检测当前是否可以取堆栈里面缓存的消息
        }
        private static Task <ActorTask> GetAsync(this ActorLocationSender self)
        {
            if (self.WaitingTasks.Count > 0)
            {
                ActorTask task = self.WaitingTasks.Peek();
                return(Task.FromResult(task));
            }

            self.Tcs = new TaskCompletionSource <ActorTask>();
            return(self.Tcs.Task);
        }
        public static Task <IActorLocationResponse> Call(this ActorLocationSender self, IActorLocationRequest request)
        {
            if (request == null)
            {
                throw new Exception($"actor location call message is null");
            }
            TaskCompletionSource <IActorLocationResponse> tcs = new TaskCompletionSource <IActorLocationResponse>();
            ActorTask task = new ActorTask(request, tcs);

            self.Add(task);
            return(task.Tcs.Task);
        }
        private void Behavior(IActor msg)
        {
            // get number of actor in directory
            StringBuilder sb = new StringBuilder();

            sb.AppendLine(DirectoryActor.GetDirectory().Stat());
            // get number of actor in queue list
            sb.AppendLine(ActorTask.Stat());
            // get number of actor in hostdirectory
            sb.AppendLine(HostDirectoryActor.GetInstance().GetStat());
            msg.SendMessage(sb.ToString());
            Become(new NullBehaviors());
        }
        private static void AllowGet(this ActorLocationSender self)
        {
            if (self.Tcs == null || self.WaitingTasks.Count <= 0)
            {
                return;
            }

            ActorTask task = self.WaitingTasks.Peek();

            var t = self.Tcs;

            self.Tcs = null;
            t.SetResult(task);
        }
        private static void Add(this ActorLocationSender self, ActorTask task)
        {
            if (self.IsDisposed)
            {
                throw new Exception("ActorLocationSender Disposed! dont hold ActorMessageSender");
            }

            self.WaitingTasks.Enqueue(task);
            // failtimes > 0表示正在重试,这时候不能加到正在发送队列
            if (self.FailTimes == 0)
            {
                self.AllowGet();
            }
        }
Example #23
0
        public override void Destroy(ActorMessageSender self)
        {
            while (self.WaitingTasks.Count > 0)
            {
                ActorTask actorTask = self.WaitingTasks.Dequeue();
                actorTask.Tcs?.SetException(new RpcException(self.Error, ""));
            }

            self.LastSendTime = 0;
            self.Address      = null;
            self.ActorId      = 0;
            self.FailTimes    = 0;
            self.Tcs          = null;
        }
Example #24
0
        private static void Add(this ActorProxy self, ActorTask task)
        {
            if (self.IsDisposed)
            {
                throw new Exception("ActorProxy Disposed! dont hold actorproxy");
            }

            self.WaitingTasks.Enqueue(task);
            // failtimes > 0表示正在重试,这时候不能加到正在发送队列
            if (self.FailTimes == 0)
            {
                self.AllowGet();
            }
        }
Example #25
0
        /// <summary>
        /// /检测当前是否可以取堆栈里面缓存的消息
        /// </summary>
        /// <param name="self"></param>
        private static void AllowGet(this ActorLocationSender self)
        {
            ///没有缓存消息 跳出  表示不可以取棧里数据
            if (self.Tcs == null || self.WaitingTasks.Count <= 0)
            {
                return;
            }

            ActorTask task = self.WaitingTasks.Peek();               //取出第一个 但不移除

            var t = self.Tcs;

            self.Tcs = null;
            t.SetResult(task);              //设置了值 说明可以取了
        }
Example #26
0
        public override void Destroy(ActorProxy self)
        {
            self.LastSendTime = 0;
            self.Address      = null;

            while (self.WaitingTasks.Count > 0)
            {
                ActorTask actorTask = self.WaitingTasks.Dequeue();
                actorTask.RunFail(ErrorCode.ERR_NotFoundActor);
            }

            self.failTimes = 0;
            var t = self.tcs;

            self.tcs = null;
            t?.SetResult(new ActorTask());
        }
Example #27
0
        private static async Task RunTask(this ActorLocationSender self, ActorTask task)
        {
            ActorMessageSender actorMessageSender = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(self.ActorId);
            IActorResponse     response           = await actorMessageSender.Call(task.ActorRequest);

            // 发送成功
            switch (response.Error)
            {
            case ErrorCode.ERR_NotFoundActor:
                // 如果没找到Actor,重试
                ++self.FailTimes;

                // 失败MaxFailTimes次则清空actor发送队列,返回失败
                if (self.FailTimes > ActorLocationSender.MaxFailTimes)
                {
                    // 失败直接删除actorproxy
                    Log.Info($"actor send message fail, actorid: {self.Id}");
                    self.RunError(response.Error);
                    self.GetParent <ActorLocationSenderComponent>().Remove(self.Id);
                    return;
                }

                // 等待0.5s再发送
                await Game.Scene.GetComponent <TimerComponent>().WaitAsync(500);

                self.ActorId = await Game.Scene.GetComponent <LocationProxyComponent>().Get(self.Id);

                self.Address = StartConfigComponent.Instance
                               .Get(IdGenerater.GetAppIdFromId(self.ActorId))
                               .GetComponent <InnerConfig>().IPEndPoint;
                self.AllowGet();
                return;

            case ErrorCode.ERR_ActorNoMailBoxComponent:
                self.RunError(response.Error);
                self.GetParent <ActorLocationSenderComponent>().Remove(self.Id);
                return;

            default:
                self.LastSendTime = TimeHelper.Now();
                self.FailTimes    = 0;
                self.WaitingTasks.Dequeue();
                task.Tcs?.SetResult(response);
                return;
            }
        }
Example #28
0
    protected override void OnValidate()
    {
        base.OnValidate();

        if (TaskProvider != null)
        {
            TaskProvider = TaskProvider.ScriptClone();
        }

        if (Task != null)
        {
            Task = Task.ScriptClone();
        }

        if (Command != null)
        {
            Command = Command.ScriptClone();
        }
    }
Example #29
0
        private static async Task RunTask(this ActorProxy self, ActorTask task)
        {
            try
            {
                IResponse response = await task.Run();

                // 如果没找到Actor,重试
                if (response.Error == ErrorCode.ERR_NotFoundActor)
                {
                    ++self.FailTimes;

                    // 失败10次则清空actor发送队列,返回失败
                    if (self.FailTimes > self.MaxFailTimes)
                    {
                        // 失败直接删除actorproxy
                        Log.Info($"actor send message fail, actorid: {self.Id}");
                        Game.Scene.GetComponent <ActorProxyComponent>().Remove(self.Id);
                        return;
                    }

                    // 等待1s再发送
                    await Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000);

                    self.ActorId = await Game.Scene.GetComponent <LocationProxyComponent>().Get(self.Id);

                    self.Address = Game.Scene.GetComponent <StartConfigComponent>()
                                   .Get(IdGenerater.GetAppIdFromId(self.ActorId))
                                   .GetComponent <InnerConfig>().IPEndPoint;
                    self.AllowGet();
                    return;
                }

                // 发送成功
                self.LastSendTime = TimeHelper.Now();
                self.FailTimes    = 0;

                self.WaitingTasks.Dequeue();
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
Example #30
0
    protected override void Update()
    {
        if (CurrentTask == null || CurrentTask.State == eTaskState.Completed)
        {
            CurrentTask = GetTarget();
            if (CurrentTask != null)
            {
                NavMeshAgent.SetDestination(CurrentTask.Target.position);
            }
        }

        if (TalkingTask == null || TalkingTask.State == eTaskState.Completed)
        {
            TalkingTask = GetTalkTask();
        }
        SpeechBubble.SetTalking(TalkingTask != null);

        UpdateVisuals();
        base.Update();
    }