Thumbnail: optimization
This commit is contained in:
parent
39f77c5352
commit
78b98ea80b
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user