Thumbnail: optimization

This commit is contained in:
pavelbannov 2021-08-10 17:54:56 +03:00
parent 39f77c5352
commit 78b98ea80b
2 changed files with 39 additions and 34 deletions

View File

@ -15,7 +15,6 @@
*/
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
@ -32,19 +31,17 @@ namespace ASC.Files.ThumbnailBuilder
private Worker worker;
internal static readonly ConcurrentDictionary<object, FileData<int>> Queue = new ConcurrentDictionary<object, FileData<int>>();
private IServiceProvider ServiceProvider { get; }
private Service Service { get; }
public Launcher(IServiceProvider serviceProvider, Service service)
public Launcher(Service service, Worker worker)
{
ServiceProvider = serviceProvider;
Service = service;
this.worker = worker;
}
public Task StartAsync(CancellationToken cancellationToken)
{
worker = new Worker(ServiceProvider, cancellationToken);
worker.Start();
worker.Start(cancellationToken);
Service.Start();
return Task.CompletedTask;

View File

@ -26,21 +26,28 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
namespace ASC.Files.ThumbnailBuilder
{
internal class Worker
{
[Singletone]
public class Worker
{
private readonly IServiceProvider serviceProvider;
private readonly CancellationToken cancellationToken;
private readonly CancellationToken cancellationToken;
private readonly ThumbnailSettings thumbnailSettings;
private readonly ILog logger;
private Timer timer;
public Worker(IServiceProvider serviceProvider, CancellationToken cancellationToken)
public Worker(
IServiceProvider serviceProvider,
IOptionsMonitor<ILog> options,
ThumbnailSettings thumbnailSettings)
{
this.serviceProvider = serviceProvider;
this.cancellationToken = cancellationToken;
this.thumbnailSettings = thumbnailSettings;
logger = options.Get("ASC.Files.ThumbnailBuilder");
}
public void Start()
public void Start(CancellationToken cancellationToken)
{
timer = new Timer(Procedure, null, 0, Timeout.Infinite);
}
@ -57,40 +64,41 @@ namespace ASC.Files.ThumbnailBuilder
private void Procedure(object _)
{
{
timer.Change(Timeout.Infinite, Timeout.Infinite);
logger.Trace("Procedure: Start.");
if (cancellationToken.IsCancellationRequested)
{
Stop();
return;
}
}
using var scope = serviceProvider.CreateScope();
var fileDataProvider = scope.ServiceProvider.GetService<FileDataProvider>();
var logger = scope.ServiceProvider.GetService<IOptionsMonitor<ILog>>().Get("ASC.Files.ThumbnailBuilder");
var builder = scope.ServiceProvider.GetService<BuilderQueue<int>>();
var config = scope.ServiceProvider.GetService<ThumbnailSettings>();
// var configSection = (ConfigSection)ConfigurationManager.GetSection("thumbnailBuilder") ?? new ConfigSection();
//var configSection = (ConfigSection)ConfigurationManager.GetSection("thumbnailBuilder") ?? new ConfigSection();
//CommonLinkUtility.Initialize(configSection.ServerRoot, false);
timer.Change(Timeout.Infinite, Timeout.Infinite);
logger.Trace("Procedure: Start.");
var filesWithoutThumbnails = Launcher.Queue.Select(pair => pair.Value).ToList();
if (!filesWithoutThumbnails.Any())
{
logger.TraceFormat("Procedure: Waiting for data. Sleep {0}.", config.LaunchFrequency);
timer.Change(TimeSpan.FromSeconds(config.LaunchFrequency), TimeSpan.FromMilliseconds(-1));
logger.TraceFormat("Procedure: Waiting for data. Sleep {0}.", thumbnailSettings.LaunchFrequency);
timer.Change(TimeSpan.FromSeconds(thumbnailSettings.LaunchFrequency), TimeSpan.FromMilliseconds(-1));
return;
}
var premiumTenants = fileDataProvider.GetPremiumTenants();
filesWithoutThumbnails = filesWithoutThumbnails
.OrderByDescending(fileData => Array.IndexOf(premiumTenants, fileData.TenantId))
.ToList();
builder.BuildThumbnails(filesWithoutThumbnails);
}
using (var scope = serviceProvider.CreateScope())
{
var fileDataProvider = scope.ServiceProvider.GetService<FileDataProvider>();
var builder = scope.ServiceProvider.GetService<BuilderQueue<int>>();
var premiumTenants = fileDataProvider.GetPremiumTenants();
filesWithoutThumbnails = filesWithoutThumbnails
.OrderByDescending(fileData => Array.IndexOf(premiumTenants, fileData.TenantId))
.ToList();
builder.BuildThumbnails(filesWithoutThumbnails);
}
logger.Trace("Procedure: Finish.");
timer.Change(0, Timeout.Infinite);