ProcessingDocumentsWorker.cs 3.7 KB

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