diff --git a/src/ServiceControl.Transports.RabbitMQ/NoOpQueueLengthProvider.cs b/src/ServiceControl.Transports.RabbitMQ/NoOpQueueLengthProvider.cs new file mode 100644 index 0000000000..09d272617a --- /dev/null +++ b/src/ServiceControl.Transports.RabbitMQ/NoOpQueueLengthProvider.cs @@ -0,0 +1,16 @@ +namespace ServiceControl.Transports.RabbitMQ +{ + using System.Threading; + using System.Threading.Tasks; + + class NoOpQueueLengthProvider : IProvideQueueLength + { + public void TrackEndpointInputQueue(EndpointToQueueMapping queueToTrack) + { + } + + public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask; + + public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; + } +} diff --git a/src/ServiceControl.Transports.RabbitMQ/RabbitMQConventionalRoutingTransportCustomization.cs b/src/ServiceControl.Transports.RabbitMQ/RabbitMQConventionalRoutingTransportCustomization.cs index 0a096c5222..8338c5d04a 100644 --- a/src/ServiceControl.Transports.RabbitMQ/RabbitMQConventionalRoutingTransportCustomization.cs +++ b/src/ServiceControl.Transports.RabbitMQ/RabbitMQConventionalRoutingTransportCustomization.cs @@ -53,11 +53,24 @@ protected override RabbitMQTransport CreateTransport(TransportSettings transport } protected override void AddTransportForPrimaryCore(IServiceCollection services, TransportSettings transportSettings) - => services.AddSingleton(); + { + if (!RabbitMQTransportExtensions.HasBrokerRequirementChecksDisabled(transportSettings.ConnectionString)) + { + services.AddSingleton(); + } + } protected sealed override void AddTransportForMonitoringCore(IServiceCollection services, TransportSettings transportSettings) { - services.AddSingleton(); + if (RabbitMQTransportExtensions.HasBrokerRequirementChecksDisabled(transportSettings.ConnectionString)) + { + services.AddSingleton(); + } + else + { + services.AddSingleton(); + } + services.AddHostedService(provider => provider.GetRequiredService()); } } diff --git a/src/ServiceControl.Transports.RabbitMQ/RabbitMQDirectRoutingTransportCustomization.cs b/src/ServiceControl.Transports.RabbitMQ/RabbitMQDirectRoutingTransportCustomization.cs index 2d497877d0..6ec3e8bb9e 100644 --- a/src/ServiceControl.Transports.RabbitMQ/RabbitMQDirectRoutingTransportCustomization.cs +++ b/src/ServiceControl.Transports.RabbitMQ/RabbitMQDirectRoutingTransportCustomization.cs @@ -53,11 +53,24 @@ protected override RabbitMQTransport CreateTransport(TransportSettings transport } protected override void AddTransportForPrimaryCore(IServiceCollection services, TransportSettings transportSettings) - => services.AddSingleton(); + { + if (!RabbitMQTransportExtensions.HasBrokerRequirementChecksDisabled(transportSettings.ConnectionString)) + { + services.AddSingleton(); + } + } protected sealed override void AddTransportForMonitoringCore(IServiceCollection services, TransportSettings transportSettings) { - services.AddSingleton(); + if (RabbitMQTransportExtensions.HasBrokerRequirementChecksDisabled(transportSettings.ConnectionString)) + { + services.AddSingleton(); + } + else + { + services.AddSingleton(); + } + services.AddHostedService(provider => provider.GetRequiredService()); } } diff --git a/src/ServiceControl.Transports.RabbitMQ/RabbitMQTransportExtensions.cs b/src/ServiceControl.Transports.RabbitMQ/RabbitMQTransportExtensions.cs index ebf285839c..f1e00cbd38 100644 --- a/src/ServiceControl.Transports.RabbitMQ/RabbitMQTransportExtensions.cs +++ b/src/ServiceControl.Transports.RabbitMQ/RabbitMQTransportExtensions.cs @@ -8,6 +8,22 @@ static class RabbitMQTransportExtensions { + public static bool HasBrokerRequirementChecksDisabled(string connectionString) + { + if (connectionString.StartsWith("amqp", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + var dictionary = new DbConnectionStringBuilder { ConnectionString = connectionString } + .OfType>() + .ToDictionary(pair => pair.Key, pair => pair.Value.ToString(), StringComparer.OrdinalIgnoreCase); + + return dictionary.TryGetValue("DisableBrokerRequirementChecks", out var value) + && bool.TryParse(value, out var disabled) + && disabled; + } + public static void ApplySettingsFromConnectionString(this RabbitMQTransport transport, string connectionString) { if (connectionString.StartsWith("amqp", StringComparison.OrdinalIgnoreCase)) @@ -42,5 +58,14 @@ public static void ApplySettingsFromConnectionString(this RabbitMQTransport tran _ = bool.TryParse(useExternalAuthMechanismString, out var useExternalAuthMechanism); transport.UseExternalAuthMechanism = useExternalAuthMechanism; } + + if (dictionary.TryGetValue("DisableBrokerRequirementChecks", out var disableBrokerRequirementChecksString) + && bool.TryParse(disableBrokerRequirementChecksString, out var disableBrokerRequirementChecks) + && disableBrokerRequirementChecks) + { + transport.DisabledBrokerRequirementChecks = + BrokerRequirementChecks.Version310OrNewer | BrokerRequirementChecks.StreamsEnabled; + transport.ValidateDeliveryLimits = false; + } } }