using Microsoft.Extensions.Logging;
using Umbraco.Cms.Core.Cache;
using Umbraco.Cms.Core.Events;
using Umbraco.Cms.Core.Sync;
using Umbraco.Core.Events;
using Umbraco.Core.Persistence;
using Umbraco.Core.Sync;
using Umbraco.Web;
using Umbraco.Web.Cache;
using Umbraco.Web.Routing;
namespace Umbraco.Infrastructure.Cache
{
///
/// Ensures that distributed cache events are setup and the is initialized
///
public sealed class DatabaseServerMessengerNotificationHandler : INotificationHandler, INotificationHandler
{
private readonly IServerMessenger _messenger;
private readonly IUmbracoDatabaseFactory _databaseFactory;
private readonly IDistributedCacheBinder _distributedCacheBinder;
private readonly ILogger _logger;
///
/// Initializes a new instance of the class.
///
public DatabaseServerMessengerNotificationHandler(
IServerMessenger serverMessenger,
IUmbracoDatabaseFactory databaseFactory,
IDistributedCacheBinder distributedCacheBinder,
ILogger logger)
{
_databaseFactory = databaseFactory;
_distributedCacheBinder = distributedCacheBinder;
_logger = logger;
_messenger = serverMessenger;
}
///
public void Handle(UmbracoApplicationStarting notification)
{
if (_databaseFactory.CanConnect == false)
{
_logger.LogWarning("Cannot connect to the database, distributed calls will not be enabled for this server.");
}
else
{
_distributedCacheBinder.BindEvents();
// Sync on startup, this will run through the messenger's initialization sequence
_messenger?.Sync();
}
}
///
/// Clear the batch on end request
///
public void Handle(UmbracoRequestEnd notification) => _messenger?.SendMessages();
}
}