Fix exception when replacing IServerRegistrar

This commit is contained in:
Stephan
2019-01-25 12:33:20 +01:00
parent 427ac259f4
commit e8cb30fbc4
2 changed files with 35 additions and 19 deletions

View File

@@ -73,16 +73,20 @@ namespace Umbraco.Core.Runtime
// register a server registrar, by default it's the db registrar
composition.RegisterUnique<IServerRegistrar>(f =>
{
if ("true".InvariantEquals(ConfigurationManager.AppSettings["umbracoDisableElectionForSingleServer"]))
return new SingleServerRegistrar(f.GetInstance<IRuntimeState>());
return new DatabaseServerRegistrar(
new Lazy<IServerRegistrationService>(f.GetInstance<IServerRegistrationService>),
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<IRuntimeState>())
: new DatabaseServerRegistrar(
new Lazy<IServerRegistrationService>(f.GetInstance<IServerRegistrationService>),
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<IServerMessenger>(factory
=> new DatabaseServerMessenger(
factory.GetInstance<IRuntimeState>(),

View File

@@ -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<IBackgroundTask>("ServerRegistration",
new BackgroundTaskRunnerOptions { AutoStart = true }, logger);
_processTaskRunner = new BackgroundTaskRunner<IBackgroundTask>("ServerInstProcess",
new BackgroundTaskRunnerOptions { AutoStart = true }, logger);
// create task runner for DatabaseServerRegistrar
_registrar = serverRegistrar as DatabaseServerRegistrar;
if (_registrar != null)
{
_touchTaskRunner = new BackgroundTaskRunner<IBackgroundTask>("ServerRegistration",
new BackgroundTaskRunnerOptions { AutoStart = true }, logger);
}
// create task runner for BatchedDatabaseServerMessenger
_messenger = serverMessenger as BatchedDatabaseServerMessenger;
if (_messenger != null)
{
_processTaskRunner = new BackgroundTaskRunner<IBackgroundTask>("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