示例#1
0
        public static void StartNewNode(out string friendlyName)
        {
            friendlyName = null;

            NumberOfNodesToStart++;

            if (NumberOfNodesToStart > 0)
            {
                Logger.DebugWithLineNumber("Start creating node configuration file for node id : " + NumberOfNodesToStart);

                var nodeConfig = CreateNodeConfigurationFile(NumberOfNodesToStart);

                friendlyName = nodeConfig.Name;

                Logger.DebugWithLineNumber("AppDomainNodeTask");

                var appDomainNodeTask =
                    new AppDomainNodeTask(_buildMode,
                                          DirectoryNodeAssemblyLocationFullPath,
                                          nodeConfig,
                                          Settings.Default.NodeAssemblyName);

                Logger.DebugWithLineNumber("Start : AppDomainNodeTask.StartTask");

                appDomainNodeTask.StartTask(new CancellationTokenSource());

                Logger.DebugWithLineNumber("Finished : AppDomainNodeTask.StartTask");

                var appDomainUniqueId = appDomainNodeTask.GetAppDomainUniqueId();

                AppDomainNodeTasks.AddOrUpdate(appDomainUniqueId,
                                               appDomainNodeTask,
                                               (s, task) => appDomainNodeTask);

                Logger.DebugWithLineNumber("Finished creating node configuration file for node : ( id, config file ) : ( " +
                                           NumberOfNodesToStart + ", " + nodeConfig.FullName + " )");
            }
        }
示例#2
0
        public static void Main(string[] args)
        {
            CurrentDomainConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
            XmlConfigurator.ConfigureAndWatch(new FileInfo(CurrentDomainConfigurationFile));

            Logger.DebugWithLineNumber("Start.");

            SetConsoleCtrlHandler(ConsoleCtrlCheck,
                                  true);

            //---------------------------------------------------------
            // Number of managers and number of nodes to start up.
            //---------------------------------------------------------
            NumberOfManagersToStart = Settings.Default.NumberOfManagersToStart;
            NumberOfNodesToStart    = Settings.Default.NumberOfNodesToStart;

            //---------------------------------------------------------
            // Use load balancer if only one mananager is used.
            //---------------------------------------------------------
            UseLoadBalancerIfJustOneManager = Settings.Default.UseLoadBalancerIfJustOneManager;

            if (args.Any())
            {
                Logger.DebugWithLineNumber("Has command arguments.");

                foreach (var s in args)
                {
                    var values = s.Split('=');

                    // Managers.
                    if (values[0].Equals(ManagersCommandArgument,
                                         StringComparison.InvariantCultureIgnoreCase))
                    {
                        NumberOfManagersToStart = Convert.ToInt32(values[1]);
                    }

                    // Nodes.
                    if (values[0].Equals(NodesCommandArgument,
                                         StringComparison.InvariantCultureIgnoreCase))
                    {
                        NumberOfNodesToStart = Convert.ToInt32(values[1]);
                    }

                    // Use load balancer.
                    if (values[0].Equals(UseLoadBalancerIfJustOneManagerArgument,
                                         StringComparison.InvariantCultureIgnoreCase))
                    {
                        UseLoadBalancerIfJustOneManager = Convert.ToBoolean(values[1]);
                    }
                }
            }

            Logger.InfoWithLineNumber(NumberOfManagersToStart + " number of managers will be started.");

            Logger.InfoWithLineNumber(NumberOfNodesToStart + " number of nodes will be started.");


            Logger.DebugWithLineNumber("AppDomain.CurrentDomain.DomainUnload");
            AppDomain.CurrentDomain.DomainUnload += CurrentDomainOnDomainUnload;

            Logger.DebugWithLineNumber("AppDomain.CurrentDomain.UnhandledException");
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

            DirectoryManagerAssemblyLocationFullPath =
                new DirectoryInfo(Path.Combine(Settings.Default.ManagerAssemblyLocationFullPath,
                                               _buildMode));

            DirectoryManagerConfigurationFileFullPath =
                new DirectoryInfo(Path.Combine(Settings.Default.ManagerConfigurationFileFullPath,
                                               _buildMode));

            Logger.DebugWithLineNumber("DirectoryManagerConfigurationFileFullPath : " +
                                       DirectoryManagerConfigurationFileFullPath.FullName);


            ManagerConfigurationFile =
                new FileInfo(Path.Combine(DirectoryManagerConfigurationFileFullPath.FullName,
                                          Settings.Default.ManagerConfigurationFileName));

            Logger.DebugWithLineNumber("ManagerConfigurationFile : " + ManagerConfigurationFile.FullName);

            CopiedManagerConfigurationFiles = new Dictionary <Uri, FileInfo>();

            var allowedDowntimeSeconds = Settings.Default.AllowedDowntimeSeconds;

            if (NumberOfManagersToStart == 1 && !UseLoadBalancerIfJustOneManager)
            {
                var configuration =
                    new Configuration(Settings.Default.ManagerLocationUri);

                Uri address = configuration.BaseAddress;

                Uri uri;

                var copiedManagerConfigurationFile =
                    CopyManagerConfigurationFile(ManagerConfigurationFile,
                                                 1,
                                                 address.ToString(),
                                                 allowedDowntimeSeconds,
                                                 out uri);

                CopiedManagerConfigurationFiles.Add(uri,
                                                    copiedManagerConfigurationFile);
            }
            else
            {
                for (var i = 0; i < NumberOfManagersToStart; i++)
                {
                    var portNumber = Settings.Default.ManagerEndpointPortNumberStart + i;

                    Uri uri;

                    var copiedManagerConfigurationFile =
                        CopyManagerConfigurationFile(ManagerConfigurationFile,
                                                     i + 1,
                                                     portNumber,
                                                     allowedDowntimeSeconds,
                                                     out uri);

                    CopiedManagerConfigurationFiles.Add(uri,
                                                        copiedManagerConfigurationFile);
                }
            }

            Logger.DebugWithLineNumber("Created " + CopiedManagerConfigurationFiles.Count + " manager configuration files.");


            DirectoryNodeConfigurationFileFullPath =
                new DirectoryInfo(Path.Combine(Settings.Default.NodeConfigurationFileFullPath,
                                               _buildMode));

            Logger.DebugWithLineNumber("DirectoryNodeConfigurationFileFullPath : " +
                                       DirectoryNodeConfigurationFileFullPath.FullName);

            NodeConfigurationFile =
                new FileInfo(Path.Combine(DirectoryNodeConfigurationFileFullPath.FullName,
                                          Settings.Default.NodeConfigurationFileName));

            Logger.DebugWithLineNumber("NodeConfigurationFile : " + NodeConfigurationFile.FullName);

            NodeconfigurationFiles = new Dictionary <string, FileInfo>();

            PortStartNumber =
                Settings.Default.NodeEndpointPortNumberStart;

            if (NumberOfNodesToStart > 0)
            {
                for (var i = 1; i <= NumberOfNodesToStart; i++)
                {
                    Logger.DebugWithLineNumber("Start creating node configuration file for node id : " + i);

                    var nodeConfig = CreateNodeConfigurationFile(i);

                    Logger.DebugWithLineNumber("Finished creating node configuration file for node : ( id, config file ) : ( " +
                                               i + ", " + nodeConfig.FullName + " )");
                }
            }

            //-------------------------------------------------------
            // App domain manager tasks.
            //-------------------------------------------------------
            Logger.DebugWithLineNumber("AppDomainManagerTasks");

            AppDomainManagerTasks = new ConcurrentDictionary <string, AppDomainManagerTask>();

            Parallel.ForEach(CopiedManagerConfigurationFiles.Values, copiedManagerConfigurationFile =>
            {
                var appDomainManagerTask =
                    new AppDomainManagerTask(_buildMode,
                                             DirectoryManagerAssemblyLocationFullPath,
                                             copiedManagerConfigurationFile,
                                             Settings.Default.ManagerAssemblyName);

                Logger.DebugWithLineNumber("Start: AppDomainManagerTask.StartTask");

                appDomainManagerTask.StartTask(new CancellationTokenSource());

                AppDomainManagerTasks.AddOrUpdate(copiedManagerConfigurationFile.Name,
                                                  appDomainManagerTask,
                                                  (s, task) => appDomainManagerTask);
            });

            Logger.DebugWithLineNumber("Finished: AppDomainManagerTask.StartTask");

            //-------------------------------------------------------
            //-------------------------------------------------------
            DirectoryNodeAssemblyLocationFullPath =
                new DirectoryInfo(Path.Combine(Settings.Default.NodeAssemblyLocationFullPath,
                                               _buildMode));

            Logger.DebugWithLineNumber("DirectoryNodeAssemblyLocationFullPath : " +
                                       DirectoryNodeAssemblyLocationFullPath.FullName);

            AppDomainNodeTasks = new ConcurrentDictionary <string, AppDomainNodeTask>();

            Parallel.ForEach(NodeconfigurationFiles, pair =>
            {
                Logger.DebugWithLineNumber("AppDomainNodeTask");

                var appDomainNodeTask =
                    new AppDomainNodeTask(_buildMode,
                                          DirectoryNodeAssemblyLocationFullPath,
                                          pair.Value,
                                          Settings.Default.NodeAssemblyName);

                Logger.DebugWithLineNumber("Start : AppDomainNodeTask.StartTask");

                appDomainNodeTask.StartTask(new CancellationTokenSource());

                Logger.DebugWithLineNumber("Finished : AppDomainNodeTask.StartTask");

                AppDomainNodeTasks.AddOrUpdate(pair.Value.Name,
                                               appDomainNodeTask,
                                               (s, task) => appDomainNodeTask);
            });

            if (NumberOfManagersToStart > 1 || UseLoadBalancerIfJustOneManager)
            {
                Task.Factory.StartNew(() => StartLoadBalancerProxy(CopiedManagerConfigurationFiles.Keys));
            }

            StartSelfHosting();
        }