Esempio n. 1
0
        public static void StartSubscriber(IWebHost host)
        {
            using (var scope = host.Services.CreateScope())
            {
                var provider = scope.ServiceProvider;

                var subscriptionOptions = provider.GetService <IOptions <SubscriberOptions> >();
                Microsoft.Extensions.Logging.ILogger <Program> logger = provider.GetService <Microsoft.Extensions.Logging.ILogger <Program> >();


                var readSourceName = subscriptionOptions.Value.TopicName;
                if (string.IsNullOrWhiteSpace(readSourceName))
                {
                    throw new Exception("Event store subcriber cannot be started.");
                }

                var repository  = provider.GetService <IReadModelRepository <ReadPointer> >();
                var readPointer = repository.GetAll()
                                  .FirstOrDefault(x => x.SourceName == readSourceName);
                if (readPointer == null)
                {
                    readPointer = new ReadPointer
                    {
                        SourceName     = readSourceName,
                        Position       = -1,
                        CreatedOn      = DateTime.Now,
                        LastModifiedOn = DateTime.Now,
                        PublicId       = Guid.NewGuid()
                    };
                    Task.Run(() =>
                    {
                        try
                        {
                            repository.AddAsync(readPointer);
                        }
                        catch (Exception e)
                        {
                            logger.LogError(e, e.Message);
                            throw;
                        }
                    }).Wait();
                }

                var eventSubscriber = provider.GetService <IEventStoreSubscriber>();
                if (eventSubscriber.IsStarted)
                {
                    return;
                }

                var position = readPointer.Position < 0 ? null : readPointer.Position;

                eventSubscriber.Start(position);
            }
        }
        public ValuesEventConsumer(IOptions <SubscriberOptions> options,
                                   IMongoClient mongoClient,
                                   ILogger <ValuesEventConsumer> logger,
                                   IReadModelRepository <ValueRecord> valueRecordsRepository,
                                   IReadModelRepository <ReadPointer> readPointerRepository,
                                   IEventStoreConnection eventStoreConnection) : base(options, eventStoreConnection)
        {
            _mongoClient            = mongoClient;
            _logger                 = logger;
            _valueRecordsRepository = valueRecordsRepository;
            _readPointerRepository  = readPointerRepository;

            // there must be at least one record!!!
            _readPointer = _readPointerRepository.GetAll()
                           .First(x => x.SourceName == options.Value.TopicName);
        }