示例#1
0
        private void OnTimerTask(Zeze.Util.SchedulerTask ThisTask)
        {
            long login     = LoginCount.Get();
            long logout    = LogoutCount.Get();
            int  online    = (int)(login - logout);
            int  onlineNew = (int)(login - LoginCountLast);

            LoginCountLast = login;

            int onlineNewPerSecond = onlineNew / TimoutDelaySeconds;

            if (onlineNewPerSecond > App.Instance.Config.MaxOnlineNew)
            {
                // 最近上线太多,马上报告负载。linkd不会再分配用户过来。
                App.Instance.Server.ReportLoad(online, App.Instance.Config.ProposeMaxOnline, onlineNew);
                // new delay for digestion
                StartTimerTask(onlineNewPerSecond / App.Instance.Config.MaxOnlineNew + App.Instance.Config.DigestionDelayExSeconds);
                // 消化完后,下一次强迫报告Load。
                ReportDelaySeconds = App.Instance.Config.ReportDelaySeconds;
                return;
            }
            // slow report
            ReportDelaySeconds += TimoutDelaySeconds;
            if (ReportDelaySeconds >= App.Instance.Config.ReportDelaySeconds)
            {
                ReportDelaySeconds = 0;
                App.Instance.Server.ReportLoad(online, App.Instance.Config.ProposeMaxOnline, onlineNew);
            }
            StartTimerTask();
        }
示例#2
0
 public void KeepAlive()
 {
     KeepAliveTask?.Cancel();
     KeepAliveTask = global::Zeze.Util.Scheduler.Instance.Schedule((ThisTask) =>
     {
         App.Instance.LinkdService.GetSocket(SessionId)?.Close(null);
     }, 3000000);
 }
示例#3
0
        // 考虑不再提供单个删除,由 Cleaner 集中清理。
        // under lockey.writelock

        /*
         * internal void Remove(K key)
         * {
         *  map.Remove(key, out var _);
         * }
         */


        public void CleanNow(Zeze.Util.SchedulerTask ThisTask)
        {
            lock (this)
            {
                if (Capacity <= 0)
                {
                    return; // 容量不限
                }
                int size = map.Count;
                if (size <= Capacity)
                {
                    return; // 容量足够
                }
                List <AccessTimeRecord> sorted = new List <AccessTimeRecord>(size);
                foreach (var p in map)
                {
                    sorted.Add(new AccessTimeRecord(p));
                }
                sorted.Sort();

                // 每次多回收 255个
                int nclean = size - Capacity + 255;
                foreach (var r in sorted)
                {
                    if (nclean <= 0)
                    {
                        break;
                    }

                    if (r.p.Value.AccessTimeTicks.Get() != r.accessTimeTicks)
                    {
                        continue; // 排序后,记录时戳发生了更新,直接跳过。
                    }
                    if (TryRemoveRecord(r.p))
                    {
                        --nclean;
                    }
                    // 运行的不频繁:不管删除是否成功,都继续循环。
                }
            }
        }