ProcessingDocumentsWorker.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System.Collections.Generic;
  2. using System.IO.Abstractions;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using BO.AppServer.Metadata.Enums;
  6. using BO.ProcessServer.Business.Enums;
  7. using BO.ProcessServer.Business.StatisticCounters;
  8. using BO.ProcessServer.Business.Workers.Contexts;
  9. using BO.ProcessServer.Options;
  10. using Connector.PS;
  11. using NLog;
  12. using Quadarax.Foundation.Core.Logging;
  13. using Quadarax.Foundation.Core.Thread;
  14. using ILogger = Quadarax.Foundation.Core.Logging.ILogger;
  15. namespace BO.ProcessServer.Business.Workers
  16. {
  17. internal class ProcessingDocumentsWorker: LoopWorker
  18. {
  19. private const string CS_WK_NAME = "ProcessingDocument";
  20. private ILogger _logger;
  21. public ProcessingDocumentsWorker(Configuration configuration,IList<SingleDocumentCalculationWorker> processes, IConnectionPS connection, IFileSystem fileSystem,Statistics statistics, Pool pool, ILogger logger)
  22. : base(CS_WK_NAME, new ProcessingDocumentsCtx(configuration, processes, connection, fileSystem, statistics, pool), logger)
  23. {
  24. _logger = logger;
  25. }
  26. public ProcessingDocumentsWorker(string workerName) : base(workerName)
  27. {
  28. }
  29. public ProcessingDocumentsWorker(string workerName, IWorkerContext context, ILogger logger = null) : base(workerName, context, logger)
  30. {
  31. }
  32. protected override async Task DoIteration(IWorkerContext context)
  33. {
  34. var ctx = (ProcessingDocumentsCtx)context;
  35. // ensure connection
  36. if (!ctx.Connection.IsOpen)
  37. ctx.Connection.Open(ctx.Configuration.ApiUser, ctx.Configuration.ApiUserPwd, ctx.Configuration.ApiMagic);
  38. while (ctx.Processes.Count(x => x.Status == ServerProcessStateEnum.Pending) <
  39. ctx.Configuration.System.ScenarioParallelThreads)
  40. {
  41. var docFiles = await ctx.Pool.GetSinglePendingDocumentFilesAsync();
  42. if (docFiles.Item1 > -1)
  43. {
  44. Log(LogSeverityEnum.Info, $"Processing document ({docFiles.Item1}) with files {string.Join(";", docFiles.Item2.Select(x => "'" + ctx.FileSystem.Path.GetFileName(x)) + "'")} ...");
  45. var docinfo = ctx.Connection.GetDocumentInfoAsync(docFiles.Item1);
  46. if (docinfo != null)
  47. {
  48. var process = new SingleDocumentCalculationWorker(ctx.Connection, ctx.FileSystem, docFiles.Item1, docFiles.Item2.ToList(), ctx.Configuration, ctx.Statistics, ctx.Pool, _logger);
  49. ctx.Processes.Add(process);
  50. process.Start();
  51. await ctx.Connection.SetDocumentStateAsync(docFiles.Item1, DocumentStatusEnum.Processing);
  52. }
  53. }
  54. }
  55. }
  56. }
  57. }