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