Ejemplo n.º 1
0
        /// <summary>
        /// Configure MassTransit Service Bus
        /// http://masstransit-project.com/
        /// </summary>
        /// <param name="services"></param>
        private void ConfigureServiceBus(IServiceCollection services)
        {
            services.Configure <RabbitMqConfiguration>(Configuration.GetSection("RabbitMq"));

            var rabbitMqSettings = Configuration.GetSection("RabbitMq").Get <RabbitMqConfiguration>();
            var rabbitBaseUri    = $"amqp://{rabbitMqSettings.Host}:{rabbitMqSettings.Port}";

            var queueRateLimit = Configuration.GetSection("QueueRateLimit").Get <QueueRateLimit>();

            if (queueRateLimit == null)
            {
                queueRateLimit = new QueueRateLimit();
            }

            services.AddMassTransit(x =>
            {
                // Add RabbitMq Service Bus
                x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
                {
                    var host = cfg.Host(new Uri(rabbitBaseUri), hostConfigurator =>
                    {
                        hostConfigurator.Username(rabbitMqSettings.Username);
                        hostConfigurator.Password(rabbitMqSettings.Password);
                    });

                    // Add Diagnostic context for tracing
                    cfg.PropagateOpenTracingContext();


                    // Configure Person Search Accepted Consumer
                    cfg.ReceiveEndpoint($"{nameof(PersonSearchAccepted)}_queue", e =>
                    {
                        e.UseConcurrencyLimit(queueRateLimit.PersonSearchAccepted_ConcurrencyLimit);
                        e.UseRateLimit(queueRateLimit.PersonSearchAccepted_RateLimit, TimeSpan.FromSeconds(queueRateLimit.PersonSearchAccepted_RateInterval));
                        e.Consumer(() =>
                                   new PersonSearchAcceptedConsumer(provider.GetRequiredService <ISearchApiNotifier <PersonSearchAdapterEvent> >(), provider.GetRequiredService <ILogger <PersonSearchAcceptedConsumer> >()));
                    });
                    // Configure Person Search Completed Consumer
                    cfg.ReceiveEndpoint($"{nameof(PersonSearchCompleted)}_queue", e =>
                    {
                        e.UseConcurrencyLimit(queueRateLimit.PersonSearchCompleted_ConcurrencyLimit);
                        e.UseRateLimit(queueRateLimit.PersonSearchCompleted_RateLimit, TimeSpan.FromSeconds(queueRateLimit.PersonSearchCompleted_RateInterval));
                        e.Consumer(() =>
                                   new PersonSearchCompletedConsumer(provider.GetRequiredService <ISearchApiNotifier <PersonSearchAdapterEvent> >(), provider.GetRequiredService <ILogger <PersonSearchCompletedConsumer> >()));
                    });
                    // Configure Person Search Completed Consumer
                    cfg.ReceiveEndpoint($"{nameof(PersonSearchCompletedJCA)}_queue", e =>
                    {
                        e.UseConcurrencyLimit(queueRateLimit.PersonSearchCompletedJCA_ConcurrencyLimit);
                        e.UseRateLimit(queueRateLimit.PersonSearchCompletedJCA_RateLimit, TimeSpan.FromSeconds(queueRateLimit.PersonSearchCompletedJCA_RateInterval));
                        e.Consumer(() =>
                                   new PersonSearchCompletedJCAConsumer(provider.GetRequiredService <ISearchApiNotifier <PersonSearchAdapterEvent> >(), provider.GetRequiredService <ILogger <PersonSearchCompletedJCAConsumer> >()));
                    });

                    // Configure Person Search Rejected Consumer
                    cfg.ReceiveEndpoint($"{nameof(PersonSearchRejected)}_queue", e =>
                    {
                        e.UseConcurrencyLimit(queueRateLimit.PersonSearchRejected_ConcurrencyLimit);
                        e.UseRateLimit(queueRateLimit.PersonSearchRejected_RateLimit, TimeSpan.FromSeconds(queueRateLimit.PersonSearchRejected_RateInterval));
                        e.Consumer(() =>
                                   new PersonSearchRejectedConsumer(provider.GetRequiredService <ISearchApiNotifier <PersonSearchAdapterEvent> >(), provider.GetRequiredService <ILogger <PersonSearchRejectedConsumer> >()));
                    });

                    // Configure Person Search Failed Consumer
                    cfg.ReceiveEndpoint($"{nameof(PersonSearchFailed)}_queue", e =>
                    {
                        e.UseConcurrencyLimit(queueRateLimit.PersonSearchFailed_ConcurrencyLimit);
                        e.UseRateLimit(queueRateLimit.PersonSearchFailed_RateLimit, TimeSpan.FromSeconds(queueRateLimit.PersonSearchFailed_RateInterval));
                        e.Consumer(() =>
                                   new PersonSearchFailedConsumer(provider.GetRequiredService <ISearchApiNotifier <PersonSearchAdapterEvent> >(), provider.GetRequiredService <ILogger <PersonSearchFailedConsumer> >()));
                    });

                    // Configure Person Search Submitted Consumer
                    cfg.ReceiveEndpoint($"{nameof(PersonSearchSubmitted)}_queue", e =>
                    {
                        e.UseConcurrencyLimit(queueRateLimit.PersonSearchSubmitted_ConcurrencyLimit);
                        e.UseRateLimit(queueRateLimit.PersonSearchSubmitted_RateLimit, TimeSpan.FromSeconds(queueRateLimit.PersonSearchSubmitted_RateInterval));
                        e.Consumer(() =>
                                   new PersonSearchSubmittedConsumer(provider.GetRequiredService <ISearchApiNotifier <PersonSearchAdapterEvent> >(), provider.GetRequiredService <ILogger <PersonSearchSubmittedConsumer> >()));
                    });

                    // Configure Person Search Information Consumer
                    cfg.ReceiveEndpoint($"{nameof(PersonSearchInformation)}_queue", e =>
                    {
                        e.UseConcurrencyLimit(queueRateLimit.PersonSearchInformation_ConcurrencyLimit);
                        e.UseRateLimit(queueRateLimit.PersonSearchInformation_RateLimit, TimeSpan.FromSeconds(queueRateLimit.PersonSearchInformation_RateInterval));
                        e.Consumer(() =>
                                   new PersonSearchInformationConsumer(provider.GetRequiredService <ISearchApiNotifier <PersonSearchAdapterEvent> >(), provider.GetRequiredService <ILogger <PersonSearchInformationConsumer> >()));
                    });
                }));
            });

            services.AddHostedService <BusHostedService>();
            services.AddTransient <IDispatcher, Dispatcher>();
            services.AddTransient <IDeepSearchDispatcher, DeepSearchDispatcher>();
            //services.AddTransient<IDeepSearchService, DeepSearchService>();
            services.AddSingleton <IDeepSearchService, DeepSearchService>();
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Configure MassTransit Service Bus
        /// http://masstransit-project.com/
        /// </summary>
        /// <param name="services"></param>
        private void ConfigureServiceBus(IServiceCollection services)
        {
            services.Configure <RabbitMqConfiguration>(Configuration.GetSection("RabbitMq"));

            var rabbitMqSettings = Configuration.GetSection("RabbitMq").Get <RabbitMqConfiguration>();
            var rabbitBaseUri    = $"amqp://{rabbitMqSettings.Host}:{rabbitMqSettings.Port}";

            services.AddOptions <RetryConfiguration>().Bind(Configuration.GetSection("RetryConfiguration")).ValidateDataAnnotations();
            var retryConfiguration = Configuration.GetSection("RetryConfiguration").Get <RetryConfiguration>();

            var queueRateLimit = Configuration.GetSection("QueueRateLimit").Get <QueueRateLimit>();

            if (queueRateLimit == null)
            {
                queueRateLimit = new QueueRateLimit();
            }

            services.AddMassTransit(x =>
            {
                // Add RabbitMq Service Bus
                x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
                {
                    var host = cfg.Host(new Uri(rabbitBaseUri), hostConfigurator =>
                    {
                        hostConfigurator.Username(rabbitMqSettings.Username);
                        hostConfigurator.Password(rabbitMqSettings.Password);
                    });

                    // Add Diagnostic context for tracing
                    cfg.PropagateOpenTracingContext();


                    // Configure Search Request Ordered Consumer
                    cfg.ReceiveEndpoint($"{nameof(SearchRequestOrdered)}_queue", e =>
                    {
                        e.UseConcurrencyLimit(queueRateLimit.SearchRequestOrdered_ConcurrencyLimit);
                        e.UseRateLimit(queueRateLimit.SearchRequestOrdered_RateLimit, TimeSpan.FromSeconds(queueRateLimit.SearchRequestOrdered_RateInterval));
                        //e.UseMessageRetry(r=> {
                        //    r.Ignore<ArgumentNullException>();
                        //    r.Ignore<InvalidOperationException>();
                        //    r.Interval(retryConfiguration.RetryTimes, TimeSpan.FromMinutes(retryConfiguration.RetryInterval));
                        //});

                        e.Consumer(() =>
                                   new SearchRequestOrderedConsumer(
                                       provider.GetRequiredService <ISearchRequestNotifier <SearchRequestEvent> >(),
                                       provider.GetRequiredService <ILogger <SearchRequestOrderedConsumer> >(),
                                       provider.GetRequiredService <IOptions <RetryConfiguration> >()));
                    });

                    // Configure NotificationAcknowledged Consumer
                    cfg.ReceiveEndpoint($"{nameof(NotificationAcknowledged)}_queue", e =>
                    {
                        e.UseConcurrencyLimit(queueRateLimit.NotificationAcknowledged_ConcurrencyLimit);
                        e.UseRateLimit(queueRateLimit.NotificationAcknowledged_RateLimit, TimeSpan.FromSeconds(queueRateLimit.NotificationAcknowledged_RateInterval));
                        //e.UseMessageRetry(r => {
                        //    r.Ignore<ArgumentNullException>();
                        //    r.Ignore<InvalidOperationException>();
                        //    r.Interval(retryConfiguration.RetryTimes, TimeSpan.FromMinutes(retryConfiguration.RetryInterval));
                        //});

                        e.Consumer(() =>
                                   new NotificationAcknowledgedConsumer(
                                       provider.GetRequiredService <ISearchRequestNotifier <SearchRequestEvent> >(),
                                       provider.GetRequiredService <ILogger <NotificationAcknowledgedConsumer> >(),
                                       provider.GetRequiredService <IOptions <RetryConfiguration> >()));
                    });
                }));
            });

            services.AddHostedService <BusHostedService>();
            services.AddTransient <ISearchRequestEventPublisher, SearchRequestEventPublisher>();
        }