Skip to content

Commit 5e0946f

Browse files
Merge pull request #4821 from Particular/upgrade-to-new-asb-topology
Update to Azure Service Bus 5
2 parents 19ca929 + 5995f4e commit 5e0946f

File tree

8 files changed

+71
-46
lines changed

8 files changed

+71
-46
lines changed

src/Directory.Packages.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<PackageVersion Include="Microsoft-WindowsAPICodePack-Shell" Version="1.1.5" />
2929
<PackageVersion Include="Mindscape.Raygun4Net.NetCore" Version="11.2.1" />
3030
<PackageVersion Include="NLog.Extensions.Logging" Version="5.4.0" />
31-
<PackageVersion Include="NServiceBus" Version="9.2.4" />
31+
<PackageVersion Include="NServiceBus" Version="9.2.5" />
3232
<PackageVersion Include="NServiceBus.AcceptanceTesting" Version="9.2.4" />
3333
<PackageVersion Include="NServiceBus.AmazonSQS" Version="7.1.1" />
3434
<PackageVersion Include="NServiceBus.CustomChecks" Version="5.0.1" />
@@ -41,7 +41,7 @@
4141
<PackageVersion Include="NServiceBus.RabbitMQ" Version="9.2.0" />
4242
<PackageVersion Include="NServiceBus.SagaAudit" Version="5.0.2" />
4343
<PackageVersion Include="NServiceBus.Testing" Version="9.0.1" />
44-
<PackageVersion Include="NServiceBus.Transport.AzureServiceBus" Version="4.2.4" />
44+
<PackageVersion Include="NServiceBus.Transport.AzureServiceBus" Version="5.0.0" />
4545
<PackageVersion Include="NServiceBus.Transport.AzureStorageQueues" Version="13.0.2" />
4646
<PackageVersion Include="NServiceBus.Transport.Msmq.Sources" Version="3.0.2" />
4747
<PackageVersion Include="NServiceBus.Transport.SqlServer" Version="8.1.7" />

src/ServiceControl.Transports.ASBS.Tests/ServiceControl.Transports.ASBS.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
</PropertyGroup>
66

77
<ItemGroup>
8+
<ProjectReference Include="..\ServiceControl.Configuration\ServiceControl.Configuration.csproj" />
89
<ProjectReference Include="..\ServiceControl.Transports.ASBS\ServiceControl.Transports.ASBS.csproj" />
910
<!-- Needed to bring the dependencies that the transport plugin excludes -->
1011
<ProjectReference Include="..\ServiceControl.Transports\ServiceControl.Transports.csproj" />

src/ServiceControl.Transports.ASBS/ASBSTransportCustomization.cs

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
namespace ServiceControl.Transports.ASBS
22
{
33
using System.Linq;
4+
using System.Text.Json;
45
using BrokerThroughput;
6+
using Configuration;
57
using Microsoft.Extensions.DependencyInjection;
68
using NServiceBus;
9+
using NServiceBus.Transport.AzureServiceBus;
710

811
public class ASBSTransportCustomization : TransportCustomization<AzureServiceBusTransport>
912
{
@@ -19,18 +22,27 @@ protected override void CustomizeTransportForMonitoringEndpoint(EndpointConfigur
1922
protected override AzureServiceBusTransport CreateTransport(TransportSettings transportSettings, TransportTransactionMode preferredTransactionMode = TransportTransactionMode.ReceiveOnly)
2023
{
2124
var connectionSettings = ConnectionStringParser.Parse(transportSettings.ConnectionString);
22-
var transport = connectionSettings.AuthenticationMethod.CreateTransportDefinition(connectionSettings);
23-
transport.UseWebSockets = connectionSettings.UseWebSockets;
2425

25-
if (connectionSettings.TopicName != null)
26+
if (!transportSettings.TryGet(out TopicTopology selectedTopology))
2627
{
27-
transport.Topology = TopicTopology.Single(connectionSettings.TopicName);
28+
//Topology is pre-selected and customized only when creating transport for the primary instance
29+
//For all other cases use the connection string to determine which topology to use
30+
if (connectionSettings.TopicName != null)
31+
{
32+
#pragma warning disable CS0618 // Type or member is obsolete
33+
selectedTopology = TopicTopology.MigrateFromNamedSingleTopic(connectionSettings.TopicName);
34+
#pragma warning restore CS0618 // Type or member is obsolete
35+
}
36+
else
37+
{
38+
selectedTopology = TopicTopology.Default;
39+
}
2840
}
2941

42+
var transport = connectionSettings.AuthenticationMethod.CreateTransportDefinition(connectionSettings, selectedTopology);
43+
transport.UseWebSockets = connectionSettings.UseWebSockets;
3044
transport.EnablePartitioning = connectionSettings.EnablePartitioning;
3145

32-
transport.ConfigureNameShorteners();
33-
3446
transport.TransportTransactionMode = transport.GetSupportedTransactionModes().Contains(preferredTransactionMode) ? preferredTransactionMode : TransportTransactionMode.ReceiveOnly;
3547

3648
return transport;
@@ -40,6 +52,46 @@ protected override void AddTransportForPrimaryCore(IServiceCollection services,
4052
TransportSettings transportSettings)
4153
{
4254
services.AddSingleton<IBrokerThroughputQuery, AzureQuery>();
55+
56+
var connectionSettings = ConnectionStringParser.Parse(transportSettings.ConnectionString);
57+
TopicTopology selectedTopology;
58+
59+
var serviceBusRootNamespace = new SettingsRootNamespace("ServiceControl.Transport.ASBS");
60+
if (connectionSettings.TopicName != null)
61+
{
62+
//Bundle name provided -> use migration topology
63+
//Need to explicitly specific events to be published on the single topic
64+
#pragma warning disable CS0618 // Type or member is obsolete
65+
selectedTopology = TopicTopology.FromOptions(new MigrationTopologyOptions
66+
#pragma warning restore CS0618 // Type or member is obsolete
67+
{
68+
TopicToPublishTo = connectionSettings.TopicName,
69+
TopicToSubscribeOn = connectionSettings.TopicName,
70+
EventsToMigrateMap = [
71+
"ServiceControl.Contracts.CustomCheckFailed",
72+
"ServiceControl.Contracts.CustomCheckSucceeded",
73+
"ServiceControl.Contracts.HeartbeatRestored",
74+
"ServiceControl.Contracts.HeartbeatStopped",
75+
"ServiceControl.Contracts.FailedMessagesArchived",
76+
"ServiceControl.Contracts.FailedMessagesUnArchived",
77+
"ServiceControl.Contracts.MessageFailed",
78+
"ServiceControl.Contracts.MessageFailureResolvedByRetry",
79+
"ServiceControl.Contracts.MessageFailureResolvedManually"
80+
]
81+
});
82+
}
83+
else if (SettingsReader.TryRead<string>(serviceBusRootNamespace, "Topology", out var topologyJson))
84+
{
85+
//Load topology from json
86+
selectedTopology = TopicTopology.FromOptions(JsonSerializer.Deserialize(topologyJson, TopologyOptionsSerializationContext.Default.TopologyOptions));
87+
}
88+
else
89+
{
90+
//Default to topic-per-event topology
91+
selectedTopology = TopicTopology.Default;
92+
}
93+
94+
transportSettings.Set(selectedTopology);
4395
}
4496

4597
protected override void AddTransportForMonitoringCore(IServiceCollection services, TransportSettings transportSettings)

src/ServiceControl.Transports.ASBS/AuthenticationMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
public abstract class AuthenticationMethod
77
{
88
public abstract ServiceBusAdministrationClient BuildManagementClient();
9-
public abstract AzureServiceBusTransport CreateTransportDefinition(ConnectionSettings connectionSettings);
9+
public abstract AzureServiceBusTransport CreateTransportDefinition(ConnectionSettings connectionSettings, TopicTopology topology);
1010
}
1111
}

src/ServiceControl.Transports.ASBS/Helper.cs

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

src/ServiceControl.Transports.ASBS/SharedAccessSignatureAuthentication.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class SharedAccessSignatureAuthentication : AuthenticationMethod
1212
public override ServiceBusAdministrationClient BuildManagementClient()
1313
=> new ServiceBusAdministrationClient(ConnectionString);
1414

15-
public override AzureServiceBusTransport CreateTransportDefinition(ConnectionSettings connectionSettings)
16-
=> new AzureServiceBusTransport(ConnectionString);
15+
public override AzureServiceBusTransport CreateTransportDefinition(ConnectionSettings connectionSettings, TopicTopology topology)
16+
=> new AzureServiceBusTransport(ConnectionString, topology);
1717
}
1818
}

src/ServiceControl.Transports.ASBS/TokenCredentialAuthentication.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Azure.Identity;
55
using Azure.Messaging.ServiceBus.Administration;
66
using NServiceBus;
7-
using NServiceBus.Transport;
87

98
public class TokenCredentialAuthentication : AuthenticationMethod
109
{
@@ -30,9 +29,9 @@ public TokenCredentialAuthentication(string fullyQualifiedNamespace, string clie
3029
public override ServiceBusAdministrationClient BuildManagementClient()
3130
=> new ServiceBusAdministrationClient(FullyQualifiedNamespace, Credential);
3231

33-
public override AzureServiceBusTransport CreateTransportDefinition(ConnectionSettings connectionSettings)
32+
public override AzureServiceBusTransport CreateTransportDefinition(ConnectionSettings connectionSettings, TopicTopology topology)
3433
{
35-
var transport = new AzureServiceBusTransport(FullyQualifiedNamespace, Credential);
34+
var transport = new AzureServiceBusTransport(FullyQualifiedNamespace, Credential, topology);
3635
return transport;
3736
}
3837
}

src/ServiceControl.Transports/ServiceControl.Transports.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
<TargetFramework>net8.0</TargetFramework>
55
</PropertyGroup>
66

7+
<ItemGroup>
8+
<!-- Private=false & ExcludeAssets=runtime prevent repeatedly including binary dependencies of ServiceControl.Transports in each transport directory -->
9+
<ProjectReference Include="..\ServiceControl.Configuration\ServiceControl.Configuration.csproj" Private="false" ExcludeAssets="runtime" />
10+
</ItemGroup>
11+
712
<ItemGroup>
813
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" />
914
<PackageReference Include="NServiceBus" />

0 commit comments

Comments
 (0)