AbstractWorkerService.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. using System;
  2. using System.Collections.Generic;
  3. using Microsoft.Extensions.Logging;
  4. using Quadarax.Foundation.Core.Business.Interface;
  5. using Quadarax.Foundation.Core.Data.Interface.Domain;
  6. using Quadarax.Foundation.Core.Data.Interface.Repository;
  7. using Quadarax.Foundation.Core.Thread;
  8. using ILogger = Quadarax.Foundation.Core.Logging.ILogger;
  9. namespace Quadarax.Foundation.Core.Business
  10. {
  11. public abstract class AbstractWorkerService<TWorker, TRepository> : AbstractRepositoryService<TRepository>
  12. where TRepository: IRepository
  13. where TWorker : AbstractWorker, new()
  14. {
  15. #region *** Private fields ***
  16. private IList<Tuple<WorkerStatusInfo,TWorker>> _workers = new List<Tuple<WorkerStatusInfo,TWorker>>();
  17. private IWorkerSettings _wrkSettings;
  18. private object _lockTransient = null;
  19. #endregion
  20. #region *** Properties ***
  21. protected abstract string Name { get; }
  22. #endregion
  23. #region *** Constructors ***
  24. protected AbstractWorkerService(IWorkerSettings workerSettings, TRepository repository, IContext currentContext, ILoggerFactory logger) : base(repository, currentContext, logger)
  25. {
  26. _wrkSettings = workerSettings ?? throw new ArgumentNullException(nameof(workerSettings));
  27. InitInternal();
  28. }
  29. #endregion
  30. #region *** Public Operations ***
  31. public void Start()
  32. {
  33. lock (_lockTransient)
  34. {
  35. _lockTransient = new object();
  36. for(var a=0;a<_wrkSettings.WorkerCount;a++)
  37. {
  38. var wrk = (TWorker)Activator.CreateInstance(typeof(TWorker),$"{Name}#{a}", new RepoWorkerContext(Repository), (ILogger)LoggerFactory.CreateLogger(this.GetType()));
  39. var info = new WorkerStatusInfo(wrk?.Name);
  40. _workers.Add(new Tuple<WorkerStatusInfo, TWorker>(info, wrk));
  41. wrk?.Start();
  42. info.SetStart();
  43. info.SetIterations(wrk.CurrentThreadId, wrk.IterationCount);
  44. }
  45. _lockTransient = null;
  46. }
  47. }
  48. public void Stop()
  49. {
  50. lock (_lockTransient)
  51. {
  52. _lockTransient = new object();
  53. foreach (var wrk in _workers)
  54. {
  55. wrk.Item2.Stop();
  56. wrk.Item1.SetStop();
  57. wrk.Item1.SetIterations(wrk.Item2.CurrentThreadId, wrk.Item2.IterationCount);
  58. }
  59. _lockTransient = null;
  60. }
  61. }
  62. #endregion
  63. #region *** Private Operations ***
  64. private void InitInternal()
  65. {
  66. }
  67. #endregion
  68. #region *** Nested Classes ***
  69. private class RepoWorkerContext : IWorkerContext
  70. {
  71. public TRepository Repository { get; }
  72. public RepoWorkerContext(TRepository repository)
  73. {
  74. Repository = repository ?? throw new ArgumentNullException(nameof(repository));
  75. }
  76. }
  77. #endregion
  78. }
  79. public abstract class AbstractWorkerService<TWorker, TRepository, TRepository1> : AbstractWorkerService<TWorker, TRepository>
  80. where TRepository : IRepository
  81. where TRepository1 : IRepository
  82. where TWorker : AbstractWorker, new()
  83. {
  84. protected TRepository1 Repository1 { get; }
  85. protected AbstractWorkerService(IWorkerSettings workerSettings,TRepository1 repository1, TRepository repository, IContext currentContext, ILoggerFactory logger) : base(workerSettings, repository, currentContext, logger)
  86. {
  87. Repository1 = repository1 ?? throw new ArgumentNullException(nameof(repository1));
  88. }
  89. }
  90. public abstract class AbstractWorkerService<TWorker, TRepository, TRepository1, TRepository2> : AbstractWorkerService<TWorker, TRepository, TRepository1>
  91. where TRepository : IRepository
  92. where TRepository1 : IRepository
  93. where TRepository2 : IRepository
  94. where TWorker : AbstractWorker, new()
  95. {
  96. protected TRepository2 Repository2 { get; }
  97. protected AbstractWorkerService(IWorkerSettings workerSettings,TRepository2 repository2, TRepository1 repository1, TRepository repository, IContext currentContext, ILoggerFactory logger) : base(workerSettings,repository1, repository, currentContext, logger)
  98. {
  99. Repository2 = repository2 ?? throw new ArgumentNullException(nameof(repository2));
  100. }
  101. }
  102. public abstract class AbstractWorkerService<TWorker, TRepository, TRepository1, TRepository2, TRepository3> : AbstractWorkerService<TWorker, TRepository, TRepository1, TRepository2>
  103. where TRepository : IRepository
  104. where TRepository1 : IRepository
  105. where TRepository2 : IRepository
  106. where TRepository3 : IRepository
  107. where TWorker : AbstractWorker, new()
  108. {
  109. protected TRepository3 Repository3 { get; }
  110. protected AbstractWorkerService(IWorkerSettings workerSettings,TRepository3 repository3, TRepository2 repository2, TRepository1 repository1, TRepository repository, IContext currentContext, ILoggerFactory logger) : base(workerSettings, repository2, repository1, repository, currentContext, logger)
  111. {
  112. Repository3 = repository3 ?? throw new ArgumentNullException(nameof(repository3));
  113. }
  114. }
  115. public abstract class AbstractWorkerService<TWorker, TRepository, TRepository1, TRepository2, TRepository3, TRepository4> : AbstractWorkerService<TWorker, TRepository, TRepository1, TRepository2, TRepository3>
  116. where TRepository : IRepository
  117. where TRepository1 : IRepository
  118. where TRepository2 : IRepository
  119. where TRepository3 : IRepository
  120. where TRepository4 : IRepository
  121. where TWorker : AbstractWorker, new()
  122. {
  123. protected TRepository4 Repository4 { get; }
  124. protected AbstractWorkerService(IWorkerSettings workerSettings,TRepository4 repository4, TRepository3 repository3, TRepository2 repository2, TRepository1 repository1, TRepository repository, IContext currentContext, ILoggerFactory logger) : base(workerSettings,repository3,repository2,repository1, repository, currentContext, logger)
  125. {
  126. Repository4 = repository4 ?? throw new ArgumentNullException(nameof(repository4));
  127. }
  128. }
  129. }