예제 #1
0
    public static ServerStateManager GetInstance()
    {
        if (instance == null)
        {
            instance = new ServerStateManager();
        }

        return(instance);
    }
예제 #2
0
        protected void SetupServerStateMonitor()
        {
            var serverStateFilePath = GameServerSettings.Default.ServerStateFile;

            this.serverStateManager = new ServerStateManager(this.WorkloadController);
            this.serverStateManager.OnNewServerState += OnNewServerState;

            if (string.IsNullOrEmpty(serverStateFilePath) == false)
            {
                this.serverStateManager.Start(Path.Combine(this.ApplicationRootPath, serverStateFilePath));
            }

            if (GameServerSettings.Default.EnableNamedPipe)
            {
                serverStateManager.StartListenPipe();
            }
        }
예제 #3
0
 void Init()
 {
     webRequestHandler  = gameObject.AddComponent <webRequestHandler>();
     serverStateManager = gameObject.AddComponent <ServerStateManager>();
     userLocalDB        = UserLocalDB.LoadFromFile();
 }
예제 #4
0
        /// <summary>
        /// 初始化Logic modules
        /// </summary>
        /// <remarks>
        /// 方法在 InitOnceServer_Step1() 里被调用
        /// </remarks>
        public void Initializationing()
        {
            var dependenceModules = new List <KeyValuePair <InitDependenceAttribute, ILogicModule> >();

            foreach (var type in AssemblyUtil.GetTypesByInterface(typeof(ILogicModule)))
            {
                if (type.IsInterface)
                {
                    continue;
                }

                string moduleId = string.Empty;

                try
                {
                    var obj    = Activator.CreateInstance(type);
                    var module = (ILogicModule)obj;
                    moduleId = module.ModuleId;

                    //  获得模块的初始化依赖
                    var dependances = type.GetCustomAttributes(typeof(InitDependenceAttribute), false);
                    if (dependances.Length > 0)
                    {
                        var dependance = dependances[0] as InitDependenceAttribute;
                        if (dependance != null)
                        {
                            dependenceModules.Add(
                                new KeyValuePair <InitDependenceAttribute, ILogicModule>(dependance, module));
                        }
                    }

                    //  忽略某些模块的初始化
                    var ignore = type.GetCustomAttributes(typeof(IgnoreInitializationAttribute), true);
                    if (ignore.Length > 0)
                    {
                        Logs.Info("Ignore {0} init.", moduleId);
                        continue;
                    }

                    //  一般逻辑模块会要求实现一个模块状态输出功能
                    if (type.GetInterface(typeof(IServerState).Name) != null)
                    {
                        ServerStateManager.Register((IServerState)obj);
                    }

                    Logs.Info("Craete module {0}", moduleId);

                    modules.Add(module);
                }
                catch (Exception ex)
                {
                    Logs.Error("LogicModule.CreateModule fail. ModuleName:{0} Type:{1}    ",
                               moduleId, type.Name, ex);
                }
            }

            foreach (var dp in dependenceModules)
            {
                modules.Remove(dp.Value);
            }

            while (dependenceModules.Count > 0)
            {
                bool isChange = false;
                foreach (var dp in dependenceModules.ToArray())
                {
                    int content = 0;
                    foreach (var moduleName in dp.Key.Dependences)
                    {
                        content += modules.Count(o => o.ModuleId == moduleName);
                    }

                    if (content == dp.Key.Dependences.Length)
                    {
                        //  满足依赖条件
                        modules.Add(dp.Value);
                        isChange = true;
                        dependenceModules.Remove(dp);
                    }
                }

                if (!isChange)
                {
                    string moduleName = string.Empty;
                    dependenceModules.ForEach(o => { moduleName += o.Value.ModuleId + ","; });
                    Logs.Error("模块依赖可能存在循环依赖问题,请检查以下模块:{0}", moduleName.TrimEnd(','));

                    modules.AddRange(dependenceModules.Select(o => o.Value).ToArray());
                    break;
                }
            }

            foreach (var module in modules)
            {
                try
                {
                    module.Initializationing();
                }
                catch (Exception ex)
                {
                    Logs.Error("LogicModule.Initializationing fail. moduleId:{0}", module.ModuleId, ex);
                }
            }
        }