diff --git a/Web/Services/PiscalQueueManager.cs b/Web/Services/PiscalQueueManager.cs index 78ca263..9b64abb 100644 --- a/Web/Services/PiscalQueueManager.cs +++ b/Web/Services/PiscalQueueManager.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading; using LeafWeb.Core.DAL; using LeafWeb.Core.Entities; using LeafWeb.Core.Remote; @@ -20,10 +21,52 @@ namespace LeafWeb.Web.Services public PiscalQueueManager() : this(new DataService(), new PiscalService()) {} + private static readonly object Lock = new object(); + public void ProcessQueue() { var logger = LogManager.GetCurrentClassLogger(); + if (Monitor.TryEnter(Lock)) + { + logger.Trace("Process entered"); + + ProcessRunning(logger); + + ProcessQueue(logger); + + logger.Trace("Process completed"); + + Monitor.Exit(Lock); + } + else + { + logger.Trace("Process locked, queue already processing"); + } + } + + private void ProcessQueue(ILogger logger) + { + var runningLeafInputFiles = _dataService.GetLeafInputFiles(LeafInputStatusType.Running).ToList(); + if (runningLeafInputFiles.Any()) + return; + + var queuedFile = + _dataService + .GetLeafInputFiles(LeafInputStatusType.Queued) + .OrderBy(l => l.Id) + .FirstOrDefault(); + + if (queuedFile == null) + return; + + logger.Info("LeafInputFile: {0}, Start", queuedFile.Id); + _piscalService.RunLeafInputFile(queuedFile); + _dataService.SetLeafInputFileStatus(queuedFile, LeafInputStatusType.Running); + } + + private void ProcessRunning(ILogger logger) + { var runningLeafInputFiles = _dataService.GetLeafInputFiles(LeafInputStatusType.Running).ToList(); foreach (var file in runningLeafInputFiles) { @@ -42,7 +85,8 @@ namespace LeafWeb.Web.Services { _dataService.AddLeafOutputFile(outputFile); } - logger.Info("LeafInputFile: {0}, output files: {1}", file.Id, string.Join(", ", leafOutputFiles.Select(o => o.Filename))); + logger.Info("LeafInputFile: {0}, output files: {1}", file.Id, + string.Join(", ", leafOutputFiles.Select(o => o.Filename))); _dataService.SetLeafInputFileStatus(file, LeafInputStatusType.Complete); break; case PiscalStatus.Error: @@ -51,23 +95,6 @@ namespace LeafWeb.Web.Services break; } } - - runningLeafInputFiles = _dataService.GetLeafInputFiles(LeafInputStatusType.Running).ToList(); - if (!runningLeafInputFiles.Any()) - { - var queuedFile = - _dataService - .GetLeafInputFiles(LeafInputStatusType.Queued) - .OrderBy(l => l.Id) - .FirstOrDefault(); - - if (queuedFile != null) - { - logger.Info("LeafInputFile: {0}, Start", queuedFile.Id); - _piscalService.RunLeafInputFile(queuedFile); - _dataService.SetLeafInputFileStatus(queuedFile, LeafInputStatusType.Running); - } - } } public void Dispose()