Skip to content

Commit 0647486

Browse files
committed
Change how ManagementClient gets passed in
1 parent b11a787 commit 0647486

File tree

5 files changed

+36
-56
lines changed

5 files changed

+36
-56
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace ServiceControl.Transports.RabbitMQ;
2+
3+
using NServiceBus.Transport.RabbitMQ.ManagementApi;
4+
5+
interface IManagementClientProvider
6+
{
7+
ManagementClient ManagementClient { get; }
8+
}

src/ServiceControl.Transports.RabbitMQ/IRabbitMQTransportExtentions.cs

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/ServiceControl.Transports.RabbitMQ/RabbitMQConventionalRoutingTransportCustomization.cs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55
using BrokerThroughput;
66
using Microsoft.Extensions.DependencyInjection;
77
using NServiceBus;
8+
using NServiceBus.Transport.RabbitMQ.ManagementApi;
89

9-
public abstract class RabbitMQConventionalRoutingTransportCustomization(QueueType queueType) : TransportCustomization<RabbitMQTransport>, IRabbitMQTransportExtensions
10+
public abstract class RabbitMQConventionalRoutingTransportCustomization(NServiceBus.QueueType queueType) : TransportCustomization<RabbitMQTransport>, IManagementClientProvider
1011
{
1112
RabbitMQTransport rabbitMQTransport;
1213

13-
protected override void CustomizeTransportForPrimaryEndpoint(EndpointConfiguration endpointConfiguration, RabbitMQTransport transportDefinition, TransportSettings transportSettings) { }
14+
ManagementClient IManagementClientProvider.ManagementClient => rabbitMQTransport?.ManagementClient ?? throw new InvalidOperationException("Transport instance has not been created yet.");
15+
16+
protected override void CustomizeTransportForPrimaryEndpoint(EndpointConfiguration endpointConfiguration, RabbitMQTransport transportDefinition, TransportSettings transportSettings) => rabbitMQTransport = transportDefinition;
1417

1518
protected override void CustomizeTransportForAuditEndpoint(EndpointConfiguration endpointConfiguration, RabbitMQTransport transportDefinition, TransportSettings transportSettings) { }
1619

@@ -27,7 +30,6 @@ protected override RabbitMQTransport CreateTransport(TransportSettings transport
2730
transport.TransportTransactionMode = transport.GetSupportedTransactionModes().Contains(preferredTransactionMode) ? preferredTransactionMode : TransportTransactionMode.ReceiveOnly;
2831
transport.SetCustomSettingsFromConnectionString(transportSettings.ConnectionString);
2932

30-
rabbitMQTransport = transport;
3133
return transport;
3234
}
3335

@@ -39,15 +41,5 @@ protected sealed override void AddTransportForMonitoringCore(IServiceCollection
3941
services.AddSingleton<IProvideQueueLength, QueueLengthProvider>();
4042
services.AddHostedService(provider => provider.GetRequiredService<IProvideQueueLength>());
4143
}
42-
43-
RabbitMQTransport IRabbitMQTransportExtensions.GetTransport()
44-
{
45-
if (rabbitMQTransport == null)
46-
{
47-
throw new InvalidOperationException("Transport instance has not been created yet. Make sure CreateTransport() is called before accessing the transport.");
48-
}
49-
50-
return rabbitMQTransport;
51-
}
5244
}
5345
}

src/ServiceControl.Transports.RabbitMQ/RabbitMQDirectRoutingTransportCustomization.cs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
using BrokerThroughput;
66
using Microsoft.Extensions.DependencyInjection;
77
using NServiceBus;
8+
using NServiceBus.Transport.RabbitMQ.ManagementApi;
89

9-
public abstract class RabbitMQDirectRoutingTransportCustomization(QueueType queueType)
10-
: TransportCustomization<RabbitMQTransport>, IRabbitMQTransportExtensions
10+
public abstract class RabbitMQDirectRoutingTransportCustomization(NServiceBus.QueueType queueType) : TransportCustomization<RabbitMQTransport>, IManagementClientProvider
1111
{
1212
RabbitMQTransport rabbitMQTransport;
1313

14-
protected override void CustomizeTransportForPrimaryEndpoint(EndpointConfiguration endpointConfiguration, RabbitMQTransport transportDefinition, TransportSettings transportSettings) { }
14+
ManagementClient IManagementClientProvider.ManagementClient => rabbitMQTransport?.ManagementClient ?? throw new InvalidOperationException("Transport instance has not been created yet.");
15+
16+
protected override void CustomizeTransportForPrimaryEndpoint(EndpointConfiguration endpointConfiguration, RabbitMQTransport transportDefinition, TransportSettings transportSettings) => rabbitMQTransport = transportDefinition;
1517

1618
protected override void CustomizeTransportForAuditEndpoint(EndpointConfiguration endpointConfiguration, RabbitMQTransport transportDefinition, TransportSettings transportSettings) { }
1719

@@ -28,7 +30,6 @@ protected override RabbitMQTransport CreateTransport(TransportSettings transport
2830
transport.TransportTransactionMode = transport.GetSupportedTransactionModes().Contains(preferredTransactionMode) ? preferredTransactionMode : TransportTransactionMode.ReceiveOnly;
2931
transport.SetCustomSettingsFromConnectionString(transportSettings.ConnectionString);
3032

31-
rabbitMQTransport = transport;
3233
return transport;
3334
}
3435

@@ -40,15 +41,5 @@ protected sealed override void AddTransportForMonitoringCore(IServiceCollection
4041
services.AddSingleton<IProvideQueueLength, QueueLengthProvider>();
4142
services.AddHostedService(provider => provider.GetRequiredService<IProvideQueueLength>());
4243
}
43-
44-
RabbitMQTransport IRabbitMQTransportExtensions.GetTransport()
45-
{
46-
if (rabbitMQTransport == null)
47-
{
48-
throw new InvalidOperationException("Transport instance has not been created yet. Make sure CreateTransport() is called before accessing the transport.");
49-
}
50-
51-
return rabbitMQTransport;
52-
}
5344
}
5445
}

src/ServiceControl.Transports.RabbitMQ/RabbitMQQuery.cs

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ namespace ServiceControl.Transports.RabbitMQ;
1111
using System.Threading;
1212
using System.Threading.Tasks;
1313
using Microsoft.Extensions.Logging;
14-
using NServiceBus;
1514
using NServiceBus.Transport.RabbitMQ.ManagementApi;
1615
using Polly;
1716
using Polly.Retry;
@@ -21,7 +20,8 @@ public class RabbitMQQuery : BrokerThroughputQuery
2120
{
2221
readonly ILogger<RabbitMQQuery> logger;
2322
readonly TimeProvider timeProvider;
24-
readonly RabbitMQTransport rabbitMQTransport;
23+
readonly ManagementClient managementClient;
24+
2525
readonly ResiliencePipeline pipeline = new ResiliencePipelineBuilder()
2626
.AddRetry(new RetryStrategyOptions()) // Add retry using the default options
2727
.AddTimeout(TimeSpan.FromMinutes(2)) // Add timeout if it keeps failing
@@ -31,7 +31,15 @@ public RabbitMQQuery(ILogger<RabbitMQQuery> logger, TimeProvider timeProvider, T
3131
{
3232
this.logger = logger;
3333
this.timeProvider = timeProvider;
34-
rabbitMQTransport = GetRabbitMQTransport(transportCustomization);
34+
35+
if (transportCustomization is IManagementClientProvider provider)
36+
{
37+
managementClient = provider.ManagementClient;
38+
}
39+
else
40+
{
41+
throw new ArgumentException($"Transport customization does not implement {nameof(IManagementClientProvider)}. Type: {transportCustomization.GetType().Name}", nameof(transportCustomization));
42+
}
3543
}
3644

3745
protected override void InitializeCore(ReadOnlyDictionary<string, string> settings)
@@ -43,16 +51,6 @@ protected override void InitializeCore(ReadOnlyDictionary<string, string> settin
4351
CheckLegacySettings(settings, RabbitMQSettings.API);
4452
}
4553

46-
static RabbitMQTransport GetRabbitMQTransport(ITransportCustomization transportCustomization)
47-
{
48-
if (transportCustomization is IRabbitMQTransportExtensions rabbitMQTransportCustomization)
49-
{
50-
return rabbitMQTransportCustomization.GetTransport();
51-
}
52-
53-
throw new InvalidOperationException($"Expected a RabbitMQTransport but received {transportCustomization.GetType().Name}.");
54-
}
55-
5654
void CheckLegacySettings(ReadOnlyDictionary<string, string> settings, string key)
5755
{
5856
if (settings.TryGetValue(key, out _))
@@ -65,7 +63,7 @@ void CheckLegacySettings(ReadOnlyDictionary<string, string> settings, string key
6563
public override async IAsyncEnumerable<QueueThroughput> GetThroughputPerDay(IBrokerQueue brokerQueue, DateOnly startDate, [EnumeratorCancellation] CancellationToken cancellationToken = default)
6664
{
6765
var queue = (RabbitMQBrokerQueueDetails)brokerQueue;
68-
var response = await pipeline.ExecuteAsync(async token => await rabbitMQTransport.ManagementClient.GetQueue(queue.QueueName, token), cancellationToken);
66+
var response = await pipeline.ExecuteAsync(async token => await managementClient.GetQueue(queue.QueueName, token), cancellationToken);
6967

7068
if (response.Value is null)
7169
{
@@ -81,7 +79,7 @@ public override async IAsyncEnumerable<QueueThroughput> GetThroughputPerDay(IBro
8179
{
8280
await Task.Delay(TimeSpan.FromMinutes(15), timeProvider, cancellationToken);
8381

84-
response = await pipeline.ExecuteAsync(async token => await rabbitMQTransport.ManagementClient.GetQueue(queue.QueueName, token), cancellationToken);
82+
response = await pipeline.ExecuteAsync(async token => await managementClient.GetQueue(queue.QueueName, token), cancellationToken);
8583

8684
if (response.Value is null)
8785
{
@@ -101,7 +99,7 @@ public override async IAsyncEnumerable<QueueThroughput> GetThroughputPerDay(IBro
10199

102100
async Task GetRabbitDetails(CancellationToken cancellationToken)
103101
{
104-
var response = await pipeline.ExecuteAsync(async async => await rabbitMQTransport.ManagementClient.GetOverview(cancellationToken), cancellationToken);
102+
var response = await pipeline.ExecuteAsync(async async => await managementClient.GetOverview(cancellationToken), cancellationToken);
105103

106104
ValidateResponse(response);
107105

@@ -162,7 +160,7 @@ async Task AddAdditionalQueueDetails(RabbitMQBrokerQueueDetails brokerQueue, Can
162160
{
163161
try
164162
{
165-
var response = await pipeline.ExecuteAsync(async token => await rabbitMQTransport.ManagementClient.GetBindingsForQueue(brokerQueue.QueueName, token), cancellationToken);
163+
var response = await pipeline.ExecuteAsync(async token => await managementClient.GetBindingsForQueue(brokerQueue.QueueName, token), cancellationToken);
166164

167165
// Check if conventional binding is found
168166
if (response.Value.Any(binding => binding?.Source == brokerQueue.QueueName
@@ -181,7 +179,7 @@ async Task AddAdditionalQueueDetails(RabbitMQBrokerQueueDetails brokerQueue, Can
181179

182180
try
183181
{
184-
var response = await pipeline.ExecuteAsync(async token => await rabbitMQTransport.ManagementClient.GetBindingsForExchange(brokerQueue.QueueName, token), cancellationToken);
182+
var response = await pipeline.ExecuteAsync(async token => await managementClient.GetBindingsForExchange(brokerQueue.QueueName, token), cancellationToken);
185183

186184
// Check if delayed binding is found
187185
if (response.Value.Any(binding => binding?.Source is "nsb.v2.delay-delivery" or "nsb.delay-delivery"
@@ -200,7 +198,7 @@ async Task AddAdditionalQueueDetails(RabbitMQBrokerQueueDetails brokerQueue, Can
200198

201199
internal async Task<(List<RabbitMQBrokerQueueDetails>?, bool morePages)> GetPage(int page, CancellationToken cancellationToken)
202200
{
203-
var (StatusCode, Reason, Value, MorePages) = await pipeline.ExecuteAsync(async token => await rabbitMQTransport.ManagementClient.GetQueues(page, 500, token), cancellationToken);
201+
var (StatusCode, Reason, Value, MorePages) = await pipeline.ExecuteAsync(async token => await managementClient.GetQueues(page, 500, token), cancellationToken);
204202

205203
ValidateResponse((StatusCode, Reason, Value));
206204

@@ -229,7 +227,7 @@ static List<RabbitMQBrokerQueueDetails> MaterializeQueueDetails(List<Queue> item
229227
{
230228
try
231229
{
232-
var (statusCode, reason, value) = await rabbitMQTransport.ManagementClient.GetOverview(cancellationToken);
230+
var (statusCode, reason, value) = await managementClient.GetOverview(cancellationToken);
233231

234232
if (value is not null)
235233
{

0 commit comments

Comments
 (0)