protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            _logger.LogInformation("Starting utility network updated event consumer worker at: {time}", DateTimeOffset.Now);

            try
            {
                if (String.IsNullOrEmpty(_kafkaSetting.UtilityNetworkNotificationsTopic))
                {
                    throw new ApplicationException("UtilityNetworkNotificationsTopic Kafka app setting must be set!");
                }

                _kafkaConsumer = _eventDispatcher.Config("utility_network_updated_event_" + Guid.NewGuid(), c => {
                    var kafkaConfig = c.UseKafka(_kafkaSetting.Server);

                    if (_kafkaSetting.CertificateFilename != null)
                    {
                        kafkaConfig.WithCertificate(_kafkaSetting.CertificateFilename);
                    }
                })
                                 .Logging(l => l.UseSerilog())
                                 .Positions(x =>
                {
                    x.SetInitialPosition(StartFromPosition.Now);
                    x.StoreInMemory();
                })
                                 .Topics(t => t.Subscribe(_kafkaSetting.UtilityNetworkNotificationsTopic))
                                 .Start();
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
            }

            await Task.CompletedTask;
        }
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            _logger.LogInformation("Event consumer started at: {time}", DateTimeOffset.Now);

            _consumer = _eventDispatcher.Config(_topicName + "-", c => c.UseKafka(_kafkaServer))
                        .Logging(l => l.UseSerilog())
                        .Positions(p => p.StoreInMemory(_positionsStorage))
                        .Topics(t => t.Subscribe(_topicName))
                        .Start();

            stoppingToken.Register(() =>
                                   _logger.LogDebug($"Event consumer is stopping.."));

            while (!stoppingToken.IsCancellationRequested)
            {
                await Task.Delay(1000, stoppingToken);
            }



            _logger.LogDebug($"Event consumer is stopping...");
        }
        public void SubscribeRouteNetwork()
        {
            int incremantalId = 0;

            var serilogLogger = new LoggerConfiguration()
                                .MinimumLevel.Debug()
                                .Enrich.FromLogContext()
                                .WriteTo.Console()
                                .CreateLogger();

            var loggerFactory = (ILoggerFactory) new LoggerFactory();

            loggerFactory.AddSerilog(serilogLogger);

            _eventDispatcher = new ToposTypedEventObservable <RouteNetworkEditOperationOccuredEvent>(loggerFactory.CreateLogger <ToposTypedEventMediator <RouteNetworkEditOperationOccuredEvent> >());

            var kafkaConsumer = _eventDispatcher.Config("route_network_event_" + Guid.NewGuid(), c => c.UseKafka("20.73.229.67:9094")
                                                        .WithCertificate("/home/mihai/Certificates/kafka-aura-prod.crt"))
                                .Positions(p => p.StoreInMemory(new InMemPositionsStorage()))
                                .Topics(t => t.Subscribe("domain.route-network"))
                                .Handle(async(messages, context, token) =>
            {
                foreach (var message in messages)
                {
                    if (message.Body is RouteNetworkEditOperationOccuredEvent)
                    {
                        var route = (RouteNetworkEditOperationOccuredEvent)message.Body;
                        if (route.RouteNetworkCommands != null)
                        {
                            foreach (var command in route.RouteNetworkCommands)
                            {
                                if (command.RouteNetworkEvents != null)
                                {
                                    foreach (var routeNetworkEvent in command.RouteNetworkEvents)
                                    {
                                        try
                                        {
                                            switch (routeNetworkEvent)
                                            {
                                            case RouteNodeAdded domainEvent:
                                                incremantalId++;
                                                if (domainEvent.NamingInfo.Name != null)
                                                {
                                                    var node = new RouteNode
                                                    {
                                                        id            = domainEvent.NodeId,
                                                        incrementalId = incremantalId,
                                                        name          = domainEvent.NamingInfo.Name,
                                                        coordinates   = domainEvent.Geometry
                                                    };
                                                    if (node != null)
                                                    {
                                                        await addRouteNode(node);
                                                    }
                                                }
                                                break;

                                            case RouteNodeMarkedForDeletion domainEvent:
                                                await DeleteRouteNode(domainEvent.NodeId);
                                                break;

                                            case RouteNodeGeometryModified domainEvent:
                                                await UpdateGeometryNode(domainEvent.NodeId, domainEvent.Geometry);
                                                break;

                                            case OpenFTTH.Events.Core.NamingInfoModified domainEvent:
                                                await UpdateNameNode(domainEvent.EventId, domainEvent.NamingInfo.Name);
                                                break;
                                            }
                                        }
                                        catch (System.NullReferenceException e)
                                        {
                                            _logger.LogInformation("exception caught");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }).Start();
        }
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            _logger.LogInformation("Starting route network event consumer worker at: {time}", DateTimeOffset.Now);

            try
            {
                if (String.IsNullOrEmpty(_kafkaSetting.RouteNetworkEventTopic))
                {
                    throw new ApplicationException("RouteNetworkEventTopic Kafka app setting must be set!");
                }

                var toposConfig = _eventDispatcher.Config("route_network_event_" + Guid.NewGuid(), c => {
                    var kafkaConfig = c.UseKafka(_kafkaSetting.Server);

                    if (_kafkaSetting.CertificateFilename != null)
                    {
                        kafkaConfig.WithCertificate(_kafkaSetting.CertificateFilename);
                    }
                })
                                  .Logging(l => l.UseSerilog())
                                  .Positions(p => p.StoreInMemory(_positionsStorage))
                                  .Topics(t => t.Subscribe(_kafkaSetting.RouteNetworkEventTopic));

                _eventDispatcher.OnEvent.Subscribe(_routeNetworkEventHandler);

                _kafkaConsumer = toposConfig.Start();

                var inMemRouteNetworkState = (InMemRouteNetworkState)_routeNetworkState;


                // Wait for load mode to create an initial version/state
                _logger.LogInformation("Starting route network events load mode...");

                bool loadFinish = false;

                if (loadFinish)
                {
                    _logger.LogError("NOTICE THAT WAITING FOR ROUTE EVENTS LOADING IS DISABLED!!!");
                }

                while (!stoppingToken.IsCancellationRequested && !loadFinish)
                {
                    _logger.LogDebug("Waiting for load mode to finish creating initial state...");

                    _logger.LogInformation($"{inMemRouteNetworkState.NumberOfObjectsLoaded} route network Kafka events processed.");

                    DateTime waitStartTimestamp = DateTime.UtcNow;

                    await Task.Delay(5000, stoppingToken);

                    TimeSpan timespan = waitStartTimestamp - inMemRouteNetworkState.LastEventRecievedTimestamp;

                    if (timespan.TotalSeconds > 20)
                    {
                        loadFinish = true;
                    }
                }


                ((InMemRouteNetworkState)_routeNetworkState).FinishLoadMode();
                _logger.LogInformation("Loading of initial route network state finished.");

                // Dehydrate projections
                LogMenUsage();

                _logger.LogInformation("Start dehydrate in-memory projections...");
                _eventStore.DehydrateProjections();
                _logger.LogInformation("Finish dehydrating in-memory projections.");

                LogMenUsage();

                // We are now ready to serve the public if the loaded objects are bigger than 0
                if (inMemRouteNetworkState.NumberOfObjectsLoaded > 0)
                {
                    File.Create("/tmp/healthy");
                    _logger.LogInformation("Healhty file written writen to tmp.");
                }
                else
                {
                    throw new ApplicationException("Recieved no route network elements from Kafka topic.");
                }

                // Start conversion
                new ConversionRunner(_loggerFactory, _eventStore, _geoDatabaseSetting, _commandDispatcher, _queryDispatcher).Run();
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
            }

            await Task.CompletedTask;
        }