public void SetupDetector()
        {
            var dbContextProvider = Substitute.For <IEventuateTramDbContextProvider>();

            _dbContext = Substitute.For <EventuateTramDbContext>();
            dbContextProvider.CreateDbContext().Returns(_dbContext);
            var logger = Substitute.For <ILogger <SqlTableBasedDuplicateMessageDetector> >();

            _detector = new SqlTableBasedDuplicateMessageDetector(dbContextProvider, logger);
        }
Exemple #2
0
        public async Task SendAsync(IMessage message)
        {
            // Relies on database column default value to set creation_time
            var messageEntity = new Message(message);

            await using (EventuateTramDbContext dbContext = _dbContextProvider.CreateDbContext())
            {
                dbContext.Messages.Add(messageEntity);
                await dbContext.SaveChangesAsync();
            }
        }
Exemple #3
0
        /// <summary>
        /// Send message puts the message in the database to be processed
        /// by the CDC.
        /// </summary>
        /// <param name="message">Message to publish</param>
        void IMessageSender.Send(IMessage message)
        {
            // Relies on database column default value to set creation_time
            var messageEntity = new Message(message);

            using (EventuateTramDbContext dbContext = _dbContextProvider.CreateDbContext())
            {
                dbContext.Messages.Add(messageEntity);
                dbContext.SaveChanges();
            }
        }
        protected void TestSetup(string schema, bool withInterceptor, EventuateKafkaConsumerConfigurationProperties consumerConfigProperties)
        {
            EventuateDatabaseSchemaName = schema;
            _subscriberId = Guid.NewGuid().ToString();

            if (_host == null)
            {
                _host                 = SetupTestHost(withInterceptor, consumerConfigProperties);
                _dbContext            = _host.Services.GetService <EventuateTramDbContext>();
                _domainEventPublisher = _host.Services.GetService <IDomainEventPublisher>();
                _testEventConsumer    = _host.Services.GetService <TestEventConsumer>();
                _interceptor          = (TestMessageInterceptor)_host.Services.GetService <IMessageInterceptor>();
            }
        }
        protected void DisposeTestHost()
        {
            if (_host == null)
            {
                return;
            }

            var messageConsumer = _host.Services.GetService <IMessageConsumer>();

            messageConsumer.Close();
            _host.StopAsync().Wait();
            _host.Dispose();
            _host                 = null;
            _dbContext            = null;
            _domainEventPublisher = null;
            _testEventConsumer    = null;
        }
        public bool IsDuplicate(string consumerId, string messageId)
        {
            string logContext = $"{nameof(IsDuplicate)} " +
                                $"for {nameof(consumerId)}='{consumerId}', {nameof(messageId)}='{messageId}'";

            try
            {
                _logger.LogDebug($"+{logContext}");
                using (EventuateTramDbContext dbContext = _dbContextProvider.CreateDbContext())
                {
                    // Relies on database column default value to set creation_time
                    dbContext.ReceivedMessages.Add(new ReceivedMessage
                    {
                        ConsumerId = consumerId, MessageId = messageId
                    });
                    dbContext.SaveChanges();
                }

                _logger.LogDebug($"-{logContext}");

                return(false);
            }
            catch (DbUpdateException e)
            {
                const int duplicateKeyError = 2627;

                if (e.InnerException is SqlException sqlException && sqlException.Number == duplicateKeyError)
                {
                    _logger.LogInformation($"{logContext}: Detected duplicate.");
                    return(true);
                }

                _logger.LogError(e, $"{logContext}: Got exception {e}");
                throw;
            }
        }
 protected void ClearDb(EventuateTramDbContext dbContext, String eventuateDatabaseSchemaName)
 {
     dbContext.Database.ExecuteSqlRaw(String.Format("Delete from [{0}].[message]", eventuateDatabaseSchemaName));
     dbContext.Database.ExecuteSqlRaw(String.Format("Delete from [{0}].[received_messages]", eventuateDatabaseSchemaName));
 }