public async Task Invoke(HttpContext httpContext) { // Ensure all ShellContext are loaded and available. _orchardHost.Initialize(); var shellSetting = _runningShellTable.Match(httpContext); // Register the shell settings as a custom feature. httpContext.Features[typeof(ShellSettings)] = shellSetting; // We only serve the next request if the tenant has been resolved. if (shellSetting != null) { ShellContext shellContext = _orchardHost.GetOrCreateShellContext(shellSetting); using (var scope = shellContext.CreateServiceScope()) { httpContext.RequestServices = scope.ServiceProvider; if (!shellContext.IsActivated) { lock (shellSetting) { // The tenant gets activated here if (!shellContext.IsActivated) { var eventBus = scope.ServiceProvider.GetService <IEventBus>(); eventBus.NotifyAsync <IOrchardShellEvents>(x => x.ActivatingAsync()).Wait(); eventBus.NotifyAsync <IOrchardShellEvents>(x => x.ActivatedAsync()).Wait(); shellContext.IsActivated = true; } } } await _next.Invoke(httpContext); } using (var scope = shellContext.CreateServiceScope()) { var deferredTaskEngine = scope.ServiceProvider.GetService <IDeferredTaskEngine>(); if (deferredTaskEngine != null && deferredTaskEngine.HasPendingTasks) { var context = new DeferredTaskContext(scope.ServiceProvider); await deferredTaskEngine.ExecuteTasksAsync(context); } } } }
private void DoWork(object group) { // DoWork is not re-entrant as Timer will not call the callback until the previous callback has returned. // This way if a tasks takes longer than the period itself, DoWork is not called while it's still running. ShellContext shellContext = _orchardHost.GetShellContext(_shellSettings); var groupName = group as string ?? ""; foreach (var task in _tasks[groupName]) { var taskName = task.GetType().FullName; using (var scope = shellContext.CreateServiceScope()) { try { lock (_states) { _states[task] = BackgroundTaskState.Running; } if (Logger.IsEnabled(LogLevel.Information)) { Logger.LogInformation("Start processing background task \"{0}\".", taskName); } task.DoWork(scope.ServiceProvider, _applicationLifetime.ApplicationStopping); if (Logger.IsEnabled(LogLevel.Information)) { Logger.LogInformation("Finished processing background task \"{0}\".", taskName); } } catch (Exception ex) { if (Logger.IsEnabled(LogLevel.Error)) { Logger.LogError($"Error while processing background task \"{taskName}\": {ex.Message}"); } } finally { lock (_states) { _states[task] = BackgroundTaskState.Idle; } } } } }
public async Task Invoke(HttpContext httpContext) { // Ensure all ShellContext are loaded and available. _orchardHost.Initialize(); var shellSetting = _runningShellTable.Match(httpContext); // We only serve the next request if the tenant has been resolved. if (shellSetting != null) { ShellContext shellContext = _orchardHost.GetShellContext(shellSetting); httpContext.RequestServices = shellContext.ServiceProvider; using (var scope = shellContext.CreateServiceScope()) { httpContext.RequestServices = scope.ServiceProvider; if (!shellContext.IsActivated) { lock (shellSetting) { // The tenant gets activated here if (!shellContext.IsActivated) { var eventBus = scope.ServiceProvider.GetService <IEventBus>(); eventBus.NotifyAsync <IOrchardShellEvents>(x => x.ActivatingAsync()).Wait(); eventBus.NotifyAsync <IOrchardShellEvents>(x => x.ActivatedAsync()).Wait(); shellContext.IsActivated = true; } } } await _next.Invoke(httpContext); } } }
public async Task Invoke(HttpContext httpContext) { await _next.Invoke(httpContext); // Register the shell settings as a custom feature. var shellSettings = httpContext.Features[typeof(ShellSettings)] as ShellSettings; // We only serve the next request if the tenant has been resolved. if (shellSettings != null) { ShellContext shellContext = _orchardHost.GetOrCreateShellContext(shellSettings); using (var scope = shellContext.CreateServiceScope()) { var deferredTaskEngine = scope.ServiceProvider.GetService <IDeferredTaskEngine>(); if (deferredTaskEngine != null && deferredTaskEngine.HasPendingTasks) { var context = new DeferredTaskContext(scope.ServiceProvider); await deferredTaskEngine.ExecuteTasksAsync(context); } } } }