/// <summary> /// The constructor. /// </summary> /// <param name="configuration">The configuration to use for the cache host.</param> public CacheHostEngine(CacheHostConfigurationSection configuration) { // Sanitize if (configuration == null) { throw new ArgumentNullException("configuration"); } // Set default logger to file if necessary if (CustomLoggerLoader.DefaultLogger == null) { CustomLoggerLoader.DefaultLogger = new FileLogger(); } var port = configuration.Port; var physicalMemoryLimitPercentage = configuration.CacheMemoryLimitPercentage; var maximumConnections = configuration.MaximumConnections; // Configure the performance counter data manager PerformanceDataManager performanceDataManager = null; try { performanceDataManager = new PerformanceCounterPerformanceDataManager(port); } catch (InvalidOperationException) { // Performance counters aren't installed, so don't use them performanceDataManager = new PerformanceDataManager(); } // Determine the MemCache to use IMemCache memCache = new MemCache(physicalMemoryLimitPercentage, performanceDataManager); if (configuration.CompressData) { memCache = new GZipMemCache(memCache); } // Initialize the tag routing table var tagRoutingTable = new TagRoutingTable(); // Initialize the cache host server var cacheHostServer = new CacheHostServer(memCache, tagRoutingTable, CustomLoggerLoader.LoadLogger(), configuration.Port, configuration.MaximumConnections, configuration.MessageBufferSize, configuration.CommunicationTimeoutSeconds * 1000, configuration.MaximumMessageSizeKB * 1024); // Instantiate the cache host runner _cacheHostRunner = new CacheHostRunner(cacheHostServer); }
/// <summary> /// Fires when the windows service starts. /// </summary> /// <param name="args">The arguments passed, if any.</param> protected override void OnStart(string[] args) { _logger.Info("Cache Host is starting", "Cache Host is starting"); // Configure the thread pool's minimum threads ThreadPool.SetMinThreads(128, 128); _logger.Info("Cache Host is starting", "Verifying settings"); try { var port = CacheHostConfigurationSection.Settings.Port; // Configure the custom performance counter manager var customPerformanceCounterManager = new CustomPerformanceCounterManager(string.Format("port:{0}", port), false); // Initialize the mem cache container instance var physicalMemoryLimitPercentage = CacheHostConfigurationSection.Settings.CacheMemoryLimitPercentage; IMemCache memCache; var memoryCache = new MemCache("Dache", physicalMemoryLimitPercentage, customPerformanceCounterManager); if (CacheHostConfigurationSection.Settings.StorageProvider == typeof(GZipMemCache)) { memCache = new GZipMemCache(memoryCache); } else { memCache = memoryCache; } // Initialize the tag routing table var tagRoutingTable = new TagRoutingTable(); // Initialize the cache host server var maximumConnections = CacheHostConfigurationSection.Settings.MaximumConnections; var cacheHostServer = new CacheHostServer(memCache, tagRoutingTable, port, maximumConnections, 1024); // Initialize the cache host information poller var cacheHostInformationPoller = new CacheHostInformationPoller(memCache, customPerformanceCounterManager, 1000); // Instantiate the cache host engine _cacheHostEngine = new CacheHostEngine(cacheHostInformationPoller, cacheHostServer); } catch (Exception ex) { // The inner exception has the actual details of the configuration error if (ex.InnerException != null && ex.InnerException.Message != null && ex.InnerException.Message.StartsWith("The value for the property", StringComparison.OrdinalIgnoreCase)) { ex = ex.InnerException; } // Log the error _logger.Error("Cache Host failed to start", ex.Message); // Stop the service Stop(); } _logger.Info("Cache Host is starting", "Settings verified successfully"); _cacheHostEngine.Start(); }