From e8cb30fbc4cb5ee71aec1ed5a6e29b7681aed8ab Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 25 Jan 2019 12:33:20 +0100 Subject: [PATCH] Fix exception when replacing IServerRegistrar --- .../Runtime/CoreRuntimeComposer.cs | 18 ++++++---- ...aseServerRegistrarAndMessengerComponent.cs | 36 ++++++++++++------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Core/Runtime/CoreRuntimeComposer.cs b/src/Umbraco.Core/Runtime/CoreRuntimeComposer.cs index 5535d5c67b..83cc456127 100644 --- a/src/Umbraco.Core/Runtime/CoreRuntimeComposer.cs +++ b/src/Umbraco.Core/Runtime/CoreRuntimeComposer.cs @@ -73,16 +73,20 @@ namespace Umbraco.Core.Runtime // register a server registrar, by default it's the db registrar composition.RegisterUnique(f => { - if ("true".InvariantEquals(ConfigurationManager.AppSettings["umbracoDisableElectionForSingleServer"])) - return new SingleServerRegistrar(f.GetInstance()); - return new DatabaseServerRegistrar( - new Lazy(f.GetInstance), - new DatabaseServerRegistrarOptions()); + // TODO this is a hack, use proper configuration! + // also: we still register the full IServerMessenger because + // even on 1 single server we can have 2 concurrent app domains + var singleServer = "true".InvariantEquals(ConfigurationManager.AppSettings["umbracoDisableElectionForSingleServer"]); + return singleServer + ? (IServerRegistrar) new SingleServerRegistrar(f.GetInstance()) + : new DatabaseServerRegistrar( + new Lazy(f.GetInstance), + new DatabaseServerRegistrarOptions()); }); // by default we'll use the database server messenger with default options (no callbacks), - // this will be overridden by either the legacy thing or the db thing in the corresponding - // components in the web project - todo - should obsolete the legacy thing + // this will be overridden by the db thing in the corresponding components in the web + // project composition.RegisterUnique(factory => new DatabaseServerMessenger( factory.GetInstance(), diff --git a/src/Umbraco.Web/Components/DatabaseServerRegistrarAndMessengerComponent.cs b/src/Umbraco.Web/Components/DatabaseServerRegistrarAndMessengerComponent.cs index 2e3132a82c..589502e6a2 100644 --- a/src/Umbraco.Web/Components/DatabaseServerRegistrarAndMessengerComponent.cs +++ b/src/Umbraco.Web/Components/DatabaseServerRegistrarAndMessengerComponent.cs @@ -106,30 +106,36 @@ namespace Umbraco.Web.Components public DatabaseServerRegistrarAndMessengerComponent(IRuntimeState runtime, IServerRegistrar serverRegistrar, IServerMessenger serverMessenger, IServerRegistrationService registrationService, ILogger logger, IndexRebuilder indexRebuilder) { - _registrar = serverRegistrar as DatabaseServerRegistrar; - if (_registrar == null) throw new Exception("panic: registar."); - - _messenger = serverMessenger as BatchedDatabaseServerMessenger; - if (_messenger == null) throw new Exception("panic: messenger"); - _runtime = runtime; _logger = logger; _registrationService = registrationService; _indexRebuilder = indexRebuilder; - _touchTaskRunner = new BackgroundTaskRunner("ServerRegistration", - new BackgroundTaskRunnerOptions { AutoStart = true }, logger); - _processTaskRunner = new BackgroundTaskRunner("ServerInstProcess", - new BackgroundTaskRunnerOptions { AutoStart = true }, logger); + // create task runner for DatabaseServerRegistrar + _registrar = serverRegistrar as DatabaseServerRegistrar; + if (_registrar != null) + { + _touchTaskRunner = new BackgroundTaskRunner("ServerRegistration", + new BackgroundTaskRunnerOptions { AutoStart = true }, logger); + } + + // create task runner for BatchedDatabaseServerMessenger + _messenger = serverMessenger as BatchedDatabaseServerMessenger; + if (_messenger != null) + { + _processTaskRunner = new BackgroundTaskRunner("ServerInstProcess", + new BackgroundTaskRunnerOptions { AutoStart = true }, logger); + } } public void Initialize() { //We will start the whole process when a successful request is made - UmbracoModule.RouteAttempt += RegisterBackgroundTasksOnce; + if (_registrar != null || _messenger != null) + UmbracoModule.RouteAttempt += RegisterBackgroundTasksOnce; // must come last, as it references some _variables - _messenger.Startup(); + _messenger?.Startup(); } public void Terminate() @@ -175,6 +181,9 @@ namespace Umbraco.Web.Components private IBackgroundTask RegisterInstructionProcess() { + if (_messenger == null) + return null; + var task = new InstructionProcessTask(_processTaskRunner, 60000, //delay before first execution _messenger.Options.ThrottleSeconds*1000, //amount of ms between executions @@ -186,6 +195,9 @@ namespace Umbraco.Web.Components private IBackgroundTask RegisterTouchServer(IServerRegistrationService registrationService, string serverAddress) { + if (_registrar == null) + return null; + var task = new TouchServerTask(_touchTaskRunner, 15000, //delay before first execution _registrar.Options.RecurringSeconds*1000, //amount of ms between executions