Exemplo n.º 1
0
        /// <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"]));
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 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"));
 }
Exemplo n.º 4
0
 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"));
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
 public MySqlOutboxWritingMessagesAsyncTests()
 {
     _mySqlTestHelper = new MySqlTestHelper();
     _mySqlTestHelper.SetupMessageDb();
     _mySqlOutbox = new MySqlOutbox(_mySqlTestHelper.OutboxConfiguration);
 }
Exemplo n.º 9
0
        /// <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"]));
        }
Exemplo n.º 10
0
        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());
        }