From 177113b317cb3c49e8bc6f1d047ba4011a44a8b8 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Mon, 16 Jun 2014 16:11:30 -0700 Subject: [PATCH] Optimization background queries --- .../Descriptor/ShellDescriptorManager.cs | 5 ++- .../Services/JobsQueueManager.cs | 40 ++++++++++--------- .../Services/JobsQueueProcessor.cs | 2 +- .../Services/JobsQueueService.cs | 2 +- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/Orchard.Web/Core/Settings/Descriptor/ShellDescriptorManager.cs b/src/Orchard.Web/Core/Settings/Descriptor/ShellDescriptorManager.cs index 88ae8abaf..4894f25fc 100644 --- a/src/Orchard.Web/Core/Settings/Descriptor/ShellDescriptorManager.cs +++ b/src/Orchard.Web/Core/Settings/Descriptor/ShellDescriptorManager.cs @@ -57,7 +57,7 @@ namespace Orchard.Core.Settings.Descriptor { private ShellDescriptorRecord GetDescriptorRecord() { if (_shellDescriptorRecord == null) { - return _shellDescriptorRepository.Table.ToList().SingleOrDefault(); + return _shellDescriptorRecord = _shellDescriptorRepository.Table.ToList().SingleOrDefault(); } return _shellDescriptorRecord; @@ -72,11 +72,12 @@ namespace Orchard.Core.Settings.Descriptor { if (shellDescriptorRecord == null) { shellDescriptorRecord = new ShellDescriptorRecord { SerialNumber = 1 }; _shellDescriptorRepository.Create(shellDescriptorRecord); - _shellDescriptorRecord = shellDescriptorRecord; } else { shellDescriptorRecord.SerialNumber++; } + + _shellDescriptorRecord = shellDescriptorRecord; shellDescriptorRecord.Features.Clear(); foreach (var feature in enabledFeatures) { diff --git a/src/Orchard.Web/Modules/Orchard.JobsQueue/Services/JobsQueueManager.cs b/src/Orchard.Web/Modules/Orchard.JobsQueue/Services/JobsQueueManager.cs index 2e05c5525..e976fff5b 100644 --- a/src/Orchard.Web/Modules/Orchard.JobsQueue/Services/JobsQueueManager.cs +++ b/src/Orchard.Web/Modules/Orchard.JobsQueue/Services/JobsQueueManager.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using Orchard.ContentManagement; using Orchard.Data; @@ -8,45 +9,46 @@ using Orchard.Settings; namespace Orchard.JobsQueue.Services { public class JobsQueueManager : IJobsQueueManager { private readonly IRepository _jobRepository; - private readonly JobsQueueSettingsPart _jobsQueueSettingsPart; + private readonly Lazy _jobsQueueSettingsPart; public JobsQueueManager( IRepository jobRepository, ISiteService siteService) { _jobRepository = jobRepository; - _jobsQueueSettingsPart = siteService.GetSiteSettings().As(); + _jobsQueueSettingsPart = new Lazy(() => { return siteService.GetSiteSettings().As(); }); } public void Resume() { - _jobsQueueSettingsPart.Status = JobsQueueStatus.Idle; + _jobsQueueSettingsPart.Value.Status = JobsQueueStatus.Idle; } public void Pause() { - _jobsQueueSettingsPart.Status = JobsQueueStatus.Paused; + _jobsQueueSettingsPart.Value.Status = JobsQueueStatus.Paused; } public int GetJobsCount() { - return GetMessagesQuery().Count(); + return _jobRepository + .Table + .Count(); } public IEnumerable GetJobs(int startIndex, int pageSize) { - return GetMessagesQuery() - .Skip(startIndex) - .Take(pageSize) - .ToList(); - } - - public QueuedJobRecord GetJob(int id) { - return _jobRepository.Get(id); - } - - private IQueryable GetMessagesQuery() { - var query = _jobRepository + IQueryable query = _jobRepository .Table .OrderByDescending(x => x.Priority) .ThenByDescending(x => x.CreatedUtc); - return query; + if(startIndex > 0) { + query = query.Skip(startIndex); + } + + query = query.Take(pageSize); + + return query.ToList(); + } + + public QueuedJobRecord GetJob(int id) { + return _jobRepository.Get(id); } public void Delete(QueuedJobRecord job) { diff --git a/src/Orchard.Web/Modules/Orchard.JobsQueue/Services/JobsQueueProcessor.cs b/src/Orchard.Web/Modules/Orchard.JobsQueue/Services/JobsQueueProcessor.cs index 2ac3691e7..085864810 100644 --- a/src/Orchard.Web/Modules/Orchard.JobsQueue/Services/JobsQueueProcessor.cs +++ b/src/Orchard.Web/Modules/Orchard.JobsQueue/Services/JobsQueueProcessor.cs @@ -39,7 +39,7 @@ namespace Orchard.JobsQueue.Services { IEnumerable messages; while ((messages = _jobsQueueManager.Value.GetJobs(0, 10).ToArray()).Any()) { - foreach (var message in messages.AsParallel()) { + foreach (var message in messages) { ProcessMessage(message); } } diff --git a/src/Orchard.Web/Modules/Orchard.JobsQueue/Services/JobsQueueService.cs b/src/Orchard.Web/Modules/Orchard.JobsQueue/Services/JobsQueueService.cs index 2190ddf48..cb5be333b 100644 --- a/src/Orchard.Web/Modules/Orchard.JobsQueue/Services/JobsQueueService.cs +++ b/src/Orchard.Web/Modules/Orchard.JobsQueue/Services/JobsQueueService.cs @@ -28,5 +28,5 @@ namespace Orchard.JobsQueue.Services { return queuedJob; } - } + } } \ No newline at end of file