/// <summary> /// This method gets called by the runtime. Use this method to add services to the container. /// </summary> /// <param name="services"></param> public void ConfigureServices(IServiceCollection services) { var retryPolicy = Policy.Handle <Exception>().WaitAndRetry(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) }); var circuitBreakerPolicy = Policy.Handle <Exception>().CircuitBreaker(1, TimeSpan.FromMilliseconds(500)); var retryPolicyAsync = Policy.Handle <Exception>().WaitAndRetryAsync(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) }); var circuitBreakerPolicyAsync = Policy.Handle <Exception>().CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(500)); var policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy }, { CommandProcessor.RETRYPOLICYASYNC, retryPolicyAsync }, { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicyAsync } }; var messageStore = new MySqlOutbox(new MySqlOutboxConfiguration( Configuration["Database:Bookings"], Configuration["Database:MessageTableName"] )); var gatewayConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672")), Exchange = new Exchange("hotel.booking.exchange"), }; var producer = new RmqMessageProducer(gatewayConnection); services.AddBrighter(options => { options.PolicyRegistry = policyRegistry; options.BrighterMessaging = new BrighterMessaging(messageStore, producer); options.CommandProcessorLifetime = ServiceLifetime.Scoped; }) .AsyncHandlersFromAssemblies(typeof(BookGuestRoomOnAccountHandlerAsync).Assembly) .MapperRegistryFromAssemblies(typeof(GuestRoomBookingMadeMapper).Assembly); services.AddDarker(options => options.QueryProcessorLifetime = ServiceLifetime.Scoped) .AddHandlersFromAssemblies(typeof(GetBookingByIdHandlerAsync).Assembly); services.AddOpenApiDocument(config => { config.PostProcess = document => { document.Info.Version = "v1"; document.Info.Title = "Accounts API"; document.Info.Description = "Hotel customers who have accounts with us"; document.Info.TermsOfService = "None"; document.Info.Contact = new NSwag.OpenApiContact { Name = "Ian Cooper", Email = string.Empty, Url = "https://twitter.com/icooper" }; }; }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddDbContext <BookingContext>(options => options.UseMySql(Configuration["Database:Bookings"])); }
public MySqlOutboxWritingMessageTests() { _mySqlTestHelper = new MySqlTestHelper(); _mySqlTestHelper.SetupMessageDb(); _mySqlOutbox = new MySqlOutbox(_mySqlTestHelper.OutboxConfiguration); var messageHeader = new MessageHeader( messageId: Guid.NewGuid(), topic: "test_topic", messageType: MessageType.MT_DOCUMENT, timeStamp: DateTime.UtcNow.AddDays(-1), handledCount: 5, delayedMilliseconds: 5, correlationId: new Guid(), replyTo: "ReplyTo", contentType: "text/plain"); messageHeader.Bag.Add(_key1, _value1); messageHeader.Bag.Add(_key2, _value2); messageHeader.Bag.Add(_key3, _value3); messageHeader.Bag.Add(_key4, _value4); messageHeader.Bag.Add(_key5, _value5); _messageEarliest = new Message(messageHeader, new MessageBody("message body")); _mySqlOutbox.Add(_messageEarliest); }
public MySqlOutboxEmptyStoreTests() { _mySqlTestHelper = new MySqlTestHelper(); _mySqlTestHelper.SetupMessageDb(); _mySqlOutbox = new MySqlOutbox(_mySqlTestHelper.OutboxConfiguration); _messageEarliest = new Message(new MessageHeader(Guid.NewGuid(), "test_topic", MessageType.MT_DOCUMENT), new MessageBody("message body")); }
public MySqlOutboxRangeRequestAsyncTests() { _mySqlTestHelper = new MySqlTestHelper(); _mySqlTestHelper.SetupMessageDb(); _mySqlOutbox = new MySqlOutbox(_mySqlTestHelper.OutboxConfiguration); _messageEarliest = new Message(new MessageHeader(Guid.NewGuid(), _TopicFirstMessage, MessageType.MT_DOCUMENT), new MessageBody("message body")); _message1 = new Message(new MessageHeader(Guid.NewGuid(), "test_topic2", MessageType.MT_DOCUMENT), new MessageBody("message body2")); _message2 = new Message(new MessageHeader(Guid.NewGuid(), _TopicLastMessage, MessageType.MT_DOCUMENT), new MessageBody("message body3")); }
public MySqlOutboxWritingMessageAsyncTests() { _mySqlTestHelper = new MySqlTestHelper(); _mySqlTestHelper.SetupMessageDb(); _mySqlOutbox = new MySqlOutbox(_mySqlTestHelper.OutboxConfiguration); var messageHeader = new MessageHeader(Guid.NewGuid(), "test_topic", MessageType.MT_DOCUMENT, DateTime.UtcNow.AddDays(-1), 5, 5); messageHeader.Bag.Add(key1, value1); messageHeader.Bag.Add(key2, value2); _messageEarliest = new Message(messageHeader, new MessageBody("message body")); }
public MySqlOutboxFetchOutstandingMessageTests() { _mySqlTestHelper = new MySqlTestHelper(); _mySqlTestHelper.SetupMessageDb(); _mySqlOutbox = new MySqlOutbox(_mySqlTestHelper.OutboxConfiguration); _messageEarliest = new Message(new MessageHeader(Guid.NewGuid(), _TopicFirstMessage, MessageType.MT_DOCUMENT), new MessageBody("message body")); _message1 = new Message(new MessageHeader(Guid.NewGuid(), "test_topic2", MessageType.MT_DOCUMENT), new MessageBody("message body2")); _message2 = new Message(new MessageHeader(Guid.NewGuid(), _TopicLastMessage, MessageType.MT_DOCUMENT), new MessageBody("message body3")); _mySqlOutbox.Add(_messageEarliest); Task.Delay(100); _mySqlOutbox.Add(_message1); Task.Delay(100); _mySqlOutbox.Add(_message2); }
public MySqlOutboxWritngMessagesTests() { _mySqlTestHelper = new MySqlTestHelper(); _mySqlTestHelper.SetupMessageDb(); _mySqlOutbox = new MySqlOutbox(_mySqlTestHelper.OutboxConfiguration); _messageEarliest = new Message(new MessageHeader(Guid.NewGuid(), "Test", MessageType.MT_COMMAND, DateTime.UtcNow.AddHours(-3)), new MessageBody("Body")); _mySqlOutbox.Add(_messageEarliest); var message2 = new Message(new MessageHeader(Guid.NewGuid(), "Test2", MessageType.MT_COMMAND, DateTime.UtcNow.AddHours(-2)), new MessageBody("Body2")); _mySqlOutbox.Add(message2); _messageLatest = new Message(new MessageHeader(Guid.NewGuid(), "Test3", MessageType.MT_COMMAND, DateTime.UtcNow.AddHours(-1)), new MessageBody("Body3")); _mySqlOutbox.Add(_messageLatest); }
public MySqlOutboxWritingMessagesAsyncTests() { _mySqlTestHelper = new MySqlTestHelper(); _mySqlTestHelper.SetupMessageDb(); _mySqlOutbox = new MySqlOutbox(_mySqlTestHelper.OutboxConfiguration); }
/// <summary> /// This method gets called by the runtime. Use this method to add services to the container. /// </summary> /// <param name="services"></param> public void ConfigureServices(IServiceCollection services) { var retryPolicy = Policy.Handle <Exception>().WaitAndRetry(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) }); var circuitBreakerPolicy = Policy.Handle <Exception>().CircuitBreaker(1, TimeSpan.FromMilliseconds(500)); var retryPolicyAsync = Policy.Handle <Exception>().WaitAndRetryAsync(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) }); var circuitBreakerPolicyAsync = Policy.Handle <Exception>().CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(500)); var policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy }, { CommandProcessor.RETRYPOLICYASYNC, retryPolicyAsync }, { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicyAsync }, { Catalog.DynamoDbAccess, retryPolicyAsync } }; var messageStore = new MySqlOutbox(new MySqlOutboxConfiguration( Configuration["Database:Accounts"], Configuration["Database:MessageTableName"] )); var gatewayConnection = new KafkaMessagingGatewayConfiguration { Name = "paramore.brighter.accounttransfer", BootStrapServers = new[] { "localhost:9092" } }; var _kafkaMessagingProducerConfiguration = new KafkaMessagingProducerConfiguration { Acks = Acks.All, MessageTimeout = 10000, RequestTimeout = 3000, MessageSendMaxRetries = 3, RetryBackoff = 100, QueueBufferingMax = 0 }; var producer = new KafkaMessageProducerFactory(gatewayConnection, _kafkaMessagingProducerConfiguration).Create(); services.AddBrighter(options => { options.PolicyRegistry = policyRegistry; options.BrighterMessaging = new BrighterMessaging(messageStore, producer); options.CommandProcessorLifetime = ServiceLifetime.Scoped; }) .AsyncHandlersFromAssemblies(typeof(AddNewAccountHandlerAsync).Assembly) .MapperRegistryFromAssemblies(typeof(AccountEvent).Assembly); services.AddDarker(options => options.HandlerLifetime = ServiceLifetime.Scoped) .AddHandlersFromAssemblies(typeof(GetAccountByIdHandlerAsync).Assembly); services.AddOpenApiDocument(config => { config.PostProcess = document => { document.Info.Version = "v1"; document.Info.Title = "Booking API"; document.Info.Description = "book rooms in our hotel"; document.Info.TermsOfService = "None"; document.Info.Contact = new NSwag.OpenApiContact { Name = "Ian Cooper", Email = string.Empty, Url = "https://twitter.com/icooper" }; }; }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddDbContext <AccountContext>(options => options.UseMySql(Configuration["Database:Accounts"])); }
private static IHost BuildHost() { return(new HostBuilder() .ConfigureLogging(loggingBuilder => { loggingBuilder.AddConsole(); loggingBuilder.AddDebug(); }) .ConfigureHostConfiguration(configurationBuilder => { configurationBuilder.SetBasePath(Directory.GetCurrentDirectory()); configurationBuilder.AddEnvironmentVariables(prefix: "OBS_"); }) .ConfigureServices((hostContext, services) => { var retryPolicy = Policy.Handle <Exception>().WaitAndRetry(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) }); var circuitBreakerPolicy = Policy.Handle <Exception>().CircuitBreaker(1, TimeSpan.FromMilliseconds(500)); var retryPolicyAsync = Policy.Handle <Exception>().WaitAndRetryAsync(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) }); var circuitBreakerPolicyAsync = Policy.Handle <Exception>().CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(500)); var policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy }, { CommandProcessor.RETRYPOLICYASYNC, retryPolicyAsync }, { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicyAsync } }; var messageStore = new MySqlOutbox(new MySqlOutboxConfiguration( hostContext.Configuration["Database:Bookings"], hostContext.Configuration["Database:MessageTableName"] )); services.AddSingleton <IAmAnOutboxViewer <Message> >(messageStore); var gatewayConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672")), Exchange = new Exchange("hotel.booking.exchange"), }; var producer = new RmqMessageProducer(gatewayConnection); services.AddBrighter(options => { options.PolicyRegistry = policyRegistry; options.BrighterMessaging = new BrighterMessaging(messageStore, producer); }); services.AddHostedService <TimedOutboxSweeper>(); }) .UseConsoleLifetime() .Build()); }