AbstractWorkerService.cs 6.7 KB

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