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); }
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(); } }
/// <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)); }