notes/cleanup
This commit is contained in:
@@ -4,14 +4,12 @@ using System.Linq;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Newtonsoft.Json;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Configuration.Models;
|
||||
using Umbraco.Core.Hosting;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Persistence.Dtos;
|
||||
using Umbraco.Core.Scoping;
|
||||
using Umbraco.Core.Sync;
|
||||
using Umbraco.Web;
|
||||
|
||||
namespace Umbraco.Core.Sync
|
||||
@@ -19,9 +17,6 @@ namespace Umbraco.Core.Sync
|
||||
/// <summary>
|
||||
/// An <see cref="IServerMessenger"/> implementation that works by storing messages in the database.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This binds to appropriate umbraco events in order to trigger the Boot(), Sync() & FlushBatch() calls
|
||||
/// </remarks>
|
||||
public class BatchedDatabaseServerMessenger : DatabaseServerMessenger
|
||||
{
|
||||
private readonly IRequestCache _requestCache;
|
||||
@@ -48,37 +43,41 @@ namespace Umbraco.Core.Sync
|
||||
_requestAccessor = requestAccessor;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
protected override void DeliverRemote(ICacheRefresher refresher, MessageType messageType, IEnumerable<object> ids = null, string json = null)
|
||||
{
|
||||
var idsA = ids?.ToArray();
|
||||
|
||||
Type arrayType;
|
||||
if (GetArrayType(idsA, out arrayType) == false)
|
||||
if (GetArrayType(idsA, out Type arrayType) == false)
|
||||
{
|
||||
throw new ArgumentException("All items must be of the same type, either int or Guid.", nameof(ids));
|
||||
}
|
||||
|
||||
BatchMessage(refresher, messageType, idsA, arrayType, json);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void SendMessages()
|
||||
{
|
||||
var batch = GetBatch(false);
|
||||
ICollection<RefreshInstructionEnvelope> batch = GetBatch(false);
|
||||
if (batch == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var instructions = batch.SelectMany(x => x.Instructions).ToArray();
|
||||
RefreshInstruction[] instructions = batch.SelectMany(x => x.Instructions).ToArray();
|
||||
batch.Clear();
|
||||
|
||||
// Write the instructions but only create JSON blobs with a max instruction count equal to MaxProcessingInstructionCount
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
using (IScope scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
foreach (var instructionsBatch in instructions.InGroupsOf(GlobalSettings.DatabaseServerMessenger.MaxProcessingInstructionCount))
|
||||
foreach (IEnumerable<RefreshInstruction> instructionsBatch in instructions.InGroupsOf(GlobalSettings.DatabaseServerMessenger.MaxProcessingInstructionCount))
|
||||
{
|
||||
WriteInstructions(scope, instructionsBatch);
|
||||
}
|
||||
|
||||
scope.Complete();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void WriteInstructions(IScope scope, IEnumerable<RefreshInstruction> instructions)
|
||||
@@ -93,12 +92,14 @@ namespace Umbraco.Core.Sync
|
||||
scope.Database.Insert(dto);
|
||||
}
|
||||
|
||||
protected ICollection<RefreshInstructionEnvelope> GetBatch(bool create)
|
||||
private ICollection<RefreshInstructionEnvelope> GetBatch(bool create)
|
||||
{
|
||||
var key = nameof(BatchedDatabaseServerMessenger);
|
||||
|
||||
if (!_requestCache.IsAvailable)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// no thread-safety here because it'll run in only 1 thread (request) at a time
|
||||
var batch = (ICollection<RefreshInstructionEnvelope>)_requestCache.Get(key);
|
||||
@@ -111,26 +112,27 @@ namespace Umbraco.Core.Sync
|
||||
return batch;
|
||||
}
|
||||
|
||||
protected void BatchMessage(
|
||||
private void BatchMessage(
|
||||
ICacheRefresher refresher,
|
||||
MessageType messageType,
|
||||
IEnumerable<object> ids = null,
|
||||
Type idType = null,
|
||||
string json = null)
|
||||
{
|
||||
var batch = GetBatch(true);
|
||||
var instructions = RefreshInstruction.GetInstructions(refresher, messageType, ids, idType, json);
|
||||
ICollection<RefreshInstructionEnvelope> batch = GetBatch(true);
|
||||
IEnumerable<RefreshInstruction> instructions = RefreshInstruction.GetInstructions(refresher, messageType, ids, idType, json);
|
||||
|
||||
// batch if we can, else write to DB immediately
|
||||
if (batch == null)
|
||||
{
|
||||
//only write the json blob with a maximum count of the MaxProcessingInstructionCount
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
// only write the json blob with a maximum count of the MaxProcessingInstructionCount
|
||||
using (IScope scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
foreach (var maxBatch in instructions.InGroupsOf(GlobalSettings.DatabaseServerMessenger.MaxProcessingInstructionCount))
|
||||
foreach (IEnumerable<RefreshInstruction> maxBatch in instructions.InGroupsOf(GlobalSettings.DatabaseServerMessenger.MaxProcessingInstructionCount))
|
||||
{
|
||||
WriteInstructions(scope, maxBatch);
|
||||
}
|
||||
|
||||
scope.Complete();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,9 +25,6 @@ namespace Umbraco.Core.Sync
|
||||
/// </summary>
|
||||
public abstract class DatabaseServerMessenger : ServerMessengerBase
|
||||
{
|
||||
// TODO: This class is never used directly, only BatchedDatabaseServerMessenger is used so
|
||||
// this could/should be combined with that or made abstract and/or just cleaned up.
|
||||
|
||||
// TODO: This class needs to be split into a service/repo for DB access
|
||||
|
||||
/*
|
||||
@@ -55,7 +52,7 @@ namespace Umbraco.Core.Sync
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="DatabaseServerMessenger"/> class.
|
||||
/// </summary>
|
||||
public DatabaseServerMessenger(
|
||||
protected DatabaseServerMessenger(
|
||||
IMainDom mainDom,
|
||||
IScopeProvider scopeProvider,
|
||||
IProfilingLogger proflog,
|
||||
|
||||
Reference in New Issue
Block a user