Skip to content

Commit b11a787

Browse files
committed
Improve how custom connection string settings are set
1 parent a55a9a5 commit b11a787

File tree

3 files changed

+46
-55
lines changed

3 files changed

+46
-55
lines changed

src/ServiceControl.Transports.RabbitMQ/RabbitMQConventionalRoutingTransportCustomization.cs

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
namespace ServiceControl.Transports.RabbitMQ
22
{
33
using System;
4-
using System.Collections.Generic;
54
using System.Linq;
6-
using System.Text;
75
using BrokerThroughput;
86
using Microsoft.Extensions.DependencyInjection;
97
using NServiceBus;
108

11-
public abstract class RabbitMQConventionalRoutingTransportCustomization(QueueType queueType)
12-
: TransportCustomization<RabbitMQTransport>, IRabbitMQTransportExtensions
9+
public abstract class RabbitMQConventionalRoutingTransportCustomization(QueueType queueType) : TransportCustomization<RabbitMQTransport>, IRabbitMQTransportExtensions
1310
{
14-
1511
RabbitMQTransport rabbitMQTransport;
1612

1713
protected override void CustomizeTransportForPrimaryEndpoint(EndpointConfiguration endpointConfiguration, RabbitMQTransport transportDefinition, TransportSettings transportSettings) { }
@@ -22,33 +18,14 @@ protected override void CustomizeTransportForMonitoringEndpoint(EndpointConfigur
2218

2319
protected override RabbitMQTransport CreateTransport(TransportSettings transportSettings, TransportTransactionMode preferredTransactionMode = TransportTransactionMode.ReceiveOnly)
2420
{
25-
if (transportSettings.ConnectionString == null)
21+
if (transportSettings.ConnectionString is null)
2622
{
2723
throw new InvalidOperationException("Connection string not configured");
2824
}
2925

30-
var connectionConfiguration = ConnectionConfiguration.Create(transportSettings.ConnectionString, string.Empty);
31-
var connectionStringDictionary = ConnectionConfiguration.ParseNServiceBusConnectionString(transportSettings.ConnectionString, new StringBuilder());
32-
33-
var ValidateDeliveryLimitsString = GetValue(connectionStringDictionary, "ValidateDeliveryLimits", "false");
34-
if (!bool.TryParse(ValidateDeliveryLimitsString, out var validateDeliveryLimits))
35-
{
36-
throw new ArgumentException("The value for 'ValidateDeliveryLimits' must be either 'true' or 'false'");
37-
}
38-
3926
var transport = new RabbitMQTransport(RoutingTopology.Conventional(queueType), transportSettings.ConnectionString, enableDelayedDelivery: false);
4027
transport.TransportTransactionMode = transport.GetSupportedTransactionModes().Contains(preferredTransactionMode) ? preferredTransactionMode : TransportTransactionMode.ReceiveOnly;
41-
transport.ValidateDeliveryLimits = validateDeliveryLimits;
42-
43-
var url = GetValue(connectionStringDictionary, "ManagementApiUrl", string.Empty);
44-
45-
if (!string.IsNullOrEmpty(url))
46-
{
47-
var username = GetValue(connectionStringDictionary, "ManagementApiUserName", connectionConfiguration.UserName);
48-
var password = GetValue(connectionStringDictionary, "ManagementApiPassword", connectionConfiguration.Password);
49-
transport.ManagementApiConfiguration = !string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password)
50-
? new ManagementApiConfiguration(url, username, password) : new ManagementApiConfiguration(url);
51-
}
28+
transport.SetCustomSettingsFromConnectionString(transportSettings.ConnectionString);
5229

5330
rabbitMQTransport = transport;
5431
return transport;
@@ -63,9 +40,6 @@ protected sealed override void AddTransportForMonitoringCore(IServiceCollection
6340
services.AddHostedService(provider => provider.GetRequiredService<IProvideQueueLength>());
6441
}
6542

66-
static string GetValue(Dictionary<string, string> dictionary, string key, string defaultValue)
67-
=> dictionary.TryGetValue(key, out var value) ? value : defaultValue;
68-
6943
RabbitMQTransport IRabbitMQTransportExtensions.GetTransport()
7044
{
7145
if (rabbitMQTransport == null)

src/ServiceControl.Transports.RabbitMQ/RabbitMQDirectRoutingTransportCustomization.cs

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
namespace ServiceControl.Transports.RabbitMQ
22
{
33
using System;
4-
using System.Collections.Generic;
54
using System.Linq;
6-
using System.Text;
75
using BrokerThroughput;
86
using Microsoft.Extensions.DependencyInjection;
97
using NServiceBus;
@@ -18,35 +16,17 @@ protected override void CustomizeTransportForPrimaryEndpoint(EndpointConfigurati
1816
protected override void CustomizeTransportForAuditEndpoint(EndpointConfiguration endpointConfiguration, RabbitMQTransport transportDefinition, TransportSettings transportSettings) { }
1917

2018
protected override void CustomizeTransportForMonitoringEndpoint(EndpointConfiguration endpointConfiguration, RabbitMQTransport transportDefinition, TransportSettings transportSettings) { }
19+
2120
protected override RabbitMQTransport CreateTransport(TransportSettings transportSettings, TransportTransactionMode preferredTransactionMode = TransportTransactionMode.ReceiveOnly)
2221
{
23-
if (transportSettings.ConnectionString == null)
22+
if (transportSettings.ConnectionString is null)
2423
{
2524
throw new InvalidOperationException("Connection string not configured");
2625
}
2726

28-
var connectionConfiguration = ConnectionConfiguration.Create(transportSettings.ConnectionString, string.Empty);
29-
var connectionStringDictionary = ConnectionConfiguration.ParseNServiceBusConnectionString(transportSettings.ConnectionString, new StringBuilder());
30-
31-
var ValidateDeliveryLimitsString = GetValue(connectionStringDictionary, "ValidateDeliveryLimits", "true");
32-
if (!bool.TryParse(ValidateDeliveryLimitsString, out var validateDeliveryLimits))
33-
{
34-
throw new ArgumentException("The value for 'ValidateDeliveryLimits' must be either 'true' or 'false'");
35-
}
36-
3727
var transport = new RabbitMQTransport(RoutingTopology.Direct(queueType, routingKeyConvention: type => type.FullName.Replace(".", "-")), transportSettings.ConnectionString, enableDelayedDelivery: false);
3828
transport.TransportTransactionMode = transport.GetSupportedTransactionModes().Contains(preferredTransactionMode) ? preferredTransactionMode : TransportTransactionMode.ReceiveOnly;
39-
transport.ValidateDeliveryLimits = validateDeliveryLimits;
40-
41-
var url = GetValue(connectionStringDictionary, "ManagementApiUrl", string.Empty);
42-
43-
if (!string.IsNullOrEmpty(url))
44-
{
45-
var username = GetValue(connectionStringDictionary, "ManagementApiUserName", connectionConfiguration.UserName);
46-
var password = GetValue(connectionStringDictionary, "ManagementApiPassword", connectionConfiguration.Password);
47-
transport.ManagementApiConfiguration = !string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password)
48-
? new ManagementApiConfiguration(url, username, password) : new ManagementApiConfiguration(url);
49-
}
29+
transport.SetCustomSettingsFromConnectionString(transportSettings.ConnectionString);
5030

5131
rabbitMQTransport = transport;
5232
return transport;
@@ -61,9 +41,6 @@ protected sealed override void AddTransportForMonitoringCore(IServiceCollection
6141
services.AddHostedService(provider => provider.GetRequiredService<IProvideQueueLength>());
6242
}
6343

64-
static string GetValue(Dictionary<string, string> dictionary, string key, string defaultValue)
65-
=> dictionary.TryGetValue(key, out var value) ? value : defaultValue;
66-
6744
RabbitMQTransport IRabbitMQTransportExtensions.GetTransport()
6845
{
6946
if (rabbitMQTransport == null)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
namespace ServiceControl.Transports.RabbitMQ;
2+
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Data.Common;
6+
using System.Linq;
7+
using NServiceBus;
8+
9+
static class RabbitMQTransportExtensions
10+
{
11+
public static void SetCustomSettingsFromConnectionString(this RabbitMQTransport transport, string connectionString)
12+
{
13+
if (connectionString.StartsWith("amqp", StringComparison.OrdinalIgnoreCase))
14+
{
15+
return;
16+
}
17+
18+
var dictionary = new DbConnectionStringBuilder { ConnectionString = connectionString }
19+
.OfType<KeyValuePair<string, object>>()
20+
.ToDictionary(pair => pair.Key, pair => pair.Value.ToString(), StringComparer.OrdinalIgnoreCase);
21+
22+
if (dictionary.TryGetValue("ValidateDeliveryLimits", out var validateString))
23+
{
24+
_ = bool.TryParse(validateString, out var validate);
25+
transport.ValidateDeliveryLimits = validate;
26+
}
27+
28+
if (dictionary.TryGetValue("ManagementApiUrl", out var url))
29+
{
30+
if (dictionary.TryGetValue("ManagementApiUserName", out var userName) && dictionary.TryGetValue("ManagementApiPassword", out var password))
31+
{
32+
transport.ManagementApiConfiguration = new(url, userName, password);
33+
}
34+
else
35+
{
36+
transport.ManagementApiConfiguration = new(url);
37+
}
38+
}
39+
}
40+
}

0 commit comments

Comments
 (0)