/// <summary>
        /// Создаёт воркеров согласно настройкам.
        /// </summary>
        protected IReadOnlyList <TWorker> CreateWorkers(RequestProcessorNodeOptions workerOptions)
        {
            if (workerOptions == null)
            {
                throw new ArgumentNullException(nameof(workerOptions));
            }

            // сделаем локальный логер, чтобы логировать процесс создания групп
            var logger = LoggerFactory.CreateLogger(GetType().Name);

            logger.LogDebug("Создаём воркеров...");

            var workers = new List <TWorker>(workerOptions.WorkersCount);

            for (var i = 0; i < workerOptions.WorkersCount; i++)
            {
                // сделаем каждому воркеру свой логгер, чтобы логи каждого воркера были в отдельном файле
                var workerName   = $"worker_{i}";
                var workerLogger = LoggerFactory.CreateLogger(workerName);

                // сформируем параметры для воркера
                var createWorkerParams = CreateWorkerParams(workerLogger);

                // и создадим воркер
                logger.LogDebug($"Создаём worker с именем \"{workerName}\"...");
                workers.Add(CreateWorker(createWorkerParams));
            }

            logger.LogInformation("Создание воркеров завершено");

            return(workers);
        }
        protected RequestProcessorBootstrapperBase(
            RequestProcessorNodeOptions nodeOptions,
            ILoggerFactory loggerFactory,
            IServiceProvider serviceProvider)
        {
            NodeOptions = nodeOptions ?? throw new ArgumentNullException(nameof(nodeOptions));
            NodeOptions.AssertValid();

            LoggerFactory   = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
            ServiceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));

            Logger = loggerFactory.CreateLogger(GetType().Name) ?? throw new ArgumentNullException(nameof(loggerFactory));

            EventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
            EventReceivers  = new ConcurrentDictionary <IEventSource, IEventReceiver>();
        }
Beispiel #3
0
        protected RequestDispatcherBase(
            RequestProcessorNodeOptions nodeOptions,
            EventWaitHandle manualResetEvent,
            IReadOnlyList <TWorker> workers,
            ILogger logger)
        {
            if (nodeOptions == null)
            {
                throw new ArgumentNullException(nameof(nodeOptions));
            }
            NodeName           = nodeOptions.Name;
            NewEventWaitHandle = manualResetEvent ?? throw new ArgumentNullException(nameof(manualResetEvent));

            Logger = logger ?? throw new ArgumentNullException(nameof(logger));

            Workers = workers ?? throw new ArgumentNullException(nameof(workers));
            if (workers.Count == 0)
            {
                throw new ArgumentException("Нужно указать хотя бы одного воркера для обработки", nameof(workers));
            }

            _stateFlushPeriod = TimeSpan.FromSeconds(nodeOptions.StateFlushPeriodSec);
        }