//object _syncLock=new object(); public ProcessWatchDog(ILogger logger, IStateManager stateManager, IBatchEngineSubscribers batchEngineSubscribers, ICacheAside cacheAside, ISerializersFactory serializersFactory, IEntityFactory entityFactory, IEventAggregator eventAggregator, IProcessDataStorage storage, IPubSubFactory pubSubFactory, IResolver resolver, IBatchLoggerFactory loggerFactory, IProcessRepository registeredProcesses, ProcessVolumePipeline volumePipeline) : base("WatchDog", logger) { _stateManager = stateManager; _batchEngineSubscribers = batchEngineSubscribers; _cacheAside = cacheAside; _eventAggregator = eventAggregator; _storage = storage; _pubSubFactory = pubSubFactory; _resolver = resolver; _loggerFactory = loggerFactory; _registeredProcesses = registeredProcesses; _volumePipeline = volumePipeline; _groupsHandler = new GroupsHandler(logger, batchEngineSubscribers, stateManager, serializersFactory, entityFactory, resolver, loggerFactory); Interval = TimeSpan.FromMinutes(3); _subGroupRemoved = eventAggregator.Subscribe4Broadcast <ProcessGroupRemovedMessage>(RemoveGroup); _subRem = eventAggregator.Subscribe <TextMessage>(ProcessRemoved, Constants.EventProcessFinished); _serializer = SerializersFactory.Instance.GetSerializer(typeof(GroupMessage)); this._volumeGenSub = eventAggregator.Subscribe <TextMessage>(OnVolumeGenerated, Constants.EventProcessVolumeGenerated); _checkGroupSub = eventAggregator.Subscribe <TextMessage>(CheckProcessGroup, Constants.EventCheckGroupCommand); _retrySub = eventAggregator.Subscribe <TextMessage>(OnVolumeGenerated, Constants.EventProcessRetry); _healthSub = eventAggregator.Subscribe4Broadcast <HealthMessage>(PublishHealth); _systemLogger = _loggerFactory.GetSystemLogger(); this._processAddedSub = eventAggregator.Subscribe <TextMessage>(OnProcessGroupAdded, Constants.EventProcessGroupAdded); _volErrorSub = eventAggregator.Subscribe <VolumeErrorMessage>(OnProcessVolumeError); }
private void SwitchToLocalWatchDog() { _watchDogSync.EnterWriteLock(); try { _logger.Info("Switching to Master node"); _watchDogCancellationTokenSource?.Cancel(); if (_cancellationToken.IsCancellationRequested) { _logger.Info("Bus stopped, can't switch to slave node"); return; } _watchDogCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(_cancellationToken); var volumePipeline = new ProcessVolumePipeline(_watchDogCancellationTokenSource.Token, _logger, _stateManager, _cacheAside, _processRepository, VolumeHandler, _resolver, EventAggregator, _branchEngineSubscriber);//todo move to watchdog class var watchDog = new ProcessWatchDog(_logger, _stateManager, _branchEngineSubscriber, _cacheAside, SerializersFactory.Instance, EntityFactory, EventAggregator, _storage, PubSubFactory, _resolver, _batchLoggerFactory, _processRepository, volumePipeline); _watchDogPipeline = new Pipeline <IWatchDogMessage>(watchDog); _watchDogCancellationTokenSource.Token.Register(() => { _logger.Info("Master node ended"); _logger.Debug("Master node ended"); watchDog.Dispose(); }); watchDog.Start(_watchDogCancellationTokenSource.Token); _processRepository.InvokeOnMaster(); _leaderManager.InitializationComplete(); _logger.Info("Switching to Master node complete"); _logger.Debug("Running Master node"); } catch (Exception e) { _logger.Error("Error switching watchdog to primary node", e); } finally { _watchDogSync.ExitWriteLock(); } }