private void WaitForExit(BackgroundServerHost host) { try { host.WaitForExit(_configuration.ShutdownTimeout); _isRunning.Remove(host); } catch (AggregateException ex) { LogError(host, ex); } }
public HouseKeeping(IKernel kernel, InternalConfiguration configuration, Action <string> output) { if (kernel == null) { throw new ArgumentNullException(nameof(kernel)); } if (configuration == null) { throw new ArgumentNullException(nameof(configuration)); } if (output == null) { throw new ArgumentNullException(nameof(output)); } _logger = kernel.Resolve <ILogger>(); _uptime = kernel.Resolve <IUptimeTextGenerator>(); _configuration = configuration; _output = message => output($"[{this}]: {message}"); _cancellation = new CancellationTokenSource(); TaskScheduler scheduler = TaskScheduler.Current; IBackgroundServer[] servers = kernel .ResolveAll <IBackgroundWorker>() .Select(worker => new BackgroundWorkerServer(worker, scheduler)) .Concat(kernel.ResolveAll <IBackgroundServer>()) .ToArray(); CancellationToken token = kernel.Resolve <IShutdown>().Token; _heartbeatLogging = CreateHeartbeatLoggingServerHost(_configuration, scheduler, kernel); _servers = servers .Select(server => new BackgroundServerHost(server, scheduler, kernel, output)) .Concat(new[] { _heartbeatLogging }) .SkipNulls() .ToArray(); // To keep track of which servers are actually running. _isRunning = new HashSet <BackgroundServerHost>(); // Spin off the housekeeping background server _task = Start(kernel, scheduler, token); // Keep track of when Housekeeping was started. _startedAt = Time.UtcNow; }
private BackgroundServerHost CreateHeartbeatLoggingServerHost(InternalConfiguration configuration, TaskScheduler scheduler, IKernel kernel) { TimeSpan?interval = configuration.HeartbeatLoggingInterval; if (interval.HasValue) { IHeartbeatProvider[] providers = kernel .ResolveAll <IHeartbeatProvider>() .Prepend(this) .ToArray(); var repository = kernel.Resolve <IHeartbeatLoggingRepository>(); var worker = new HeartbeatLoggingWorker(providers, interval.Value, repository); var server = new BackgroundWorkerServer(worker, scheduler); var host = new BackgroundServerHost(server, scheduler, kernel, _output, _cancellation.Token); return(host); } return(null); }