From 8a5b210bcbe8c106e9934e5cb020ce32edd8fc43 Mon Sep 17 00:00:00 2001 From: Chris Patterson Date: Thu, 4 Jun 2020 15:21:04 -0500 Subject: [PATCH] Fixed #1875 - the publish topology is now used for all subscription names --- MassTransit.sln.DotSettings | 1 + src/MassTransit/Topology/IHostTopology.cs | 4 ++ .../Topology/Topologies/HostTopology.cs | 5 +-- .../Topologies/ActiveMqHostTopology.cs | 2 - .../Topology/IAmazonSqsHostTopology.cs | 4 +- .../ServiceBusReceiveEndpointBuilder.cs | 26 +----------- .../ServiceBusHostConfiguration.cs | 2 +- .../Builders/BrokerTopologyBuilder.cs | 4 +- .../PublishEndpointBrokerTopologyBuilder.cs | 41 ++++--------------- ...bscriptionConsumeTopologySpecification.cs} | 29 ------------- .../Topology/IServiceBusHostTopology.cs | 10 +---- .../IServiceBusMessagePublishTopology.cs | 3 ++ .../Topology/IServiceBusPublishTopology.cs | 15 +++++++ .../Topologies/ServiceBusConsumeTopology.cs | 2 + .../Topologies/ServiceBusHostTopology.cs | 22 +--------- .../ServiceBusMessageConsumeTopology.cs | 3 +- .../ServiceBusMessagePublishTopology.cs | 11 ++++- .../Topologies/ServiceBusPublishTopology.cs | 34 ++++++++++++++- .../Topologies/ServiceBusSendTopology.cs | 5 ++- .../BuildTopology_Specs.cs | 4 +- .../LockTimeout_Specs.cs | 2 +- 21 files changed, 94 insertions(+), 135 deletions(-) rename src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Configuration/Specifications/{QueueSubscriptionConsumeTopologySpecification.cs => SubscriptionConsumeTopologySpecification.cs} (59%) diff --git a/MassTransit.sln.DotSettings b/MassTransit.sln.DotSettings index 5e38458de7b..954092d7e2a 100644 --- a/MassTransit.sln.DotSettings +++ b/MassTransit.sln.DotSettings @@ -4,6 +4,7 @@ 3000 DO_NOT_SHOW WARNING + DO_NOT_SHOW OFF <?xml version="1.0" encoding="utf-16"?><Profile name="Normal"><HtmlReformatCode>True</HtmlReformatCode><JsReformatCode>True</JsReformatCode><XMLReformatCode>True</XMLReformatCode><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeArgumentsStyle="True" ArrangeCodeBodyStyle="True" ArrangeVarStyle="True" /><CssReformatCode>True</CssReformatCode><VBReformatCode>True</VBReformatCode><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings><EmbraceInRegion>False</EmbraceInRegion><RegionName></RegionName></CSOptimizeUsings><CSReformatCode>True</CSReformatCode><CSReorderTypeMembers>True</CSReorderTypeMembers><CSUpdateFileHeader>True</CSUpdateFileHeader><CSEnforceVarKeywordUsageSettings>True</CSEnforceVarKeywordUsageSettings><RemoveCodeRedundancies>True</RemoveCodeRedundancies><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CSShortenReferences>True</CSShortenReferences><IDEA_SETTINGS>&lt;profile version="1.0"&gt; &lt;option name="myName" value="Normal" /&gt; diff --git a/src/MassTransit/Topology/IHostTopology.cs b/src/MassTransit/Topology/IHostTopology.cs index cded0517f2a..7bc9909bb38 100644 --- a/src/MassTransit/Topology/IHostTopology.cs +++ b/src/MassTransit/Topology/IHostTopology.cs @@ -1,7 +1,11 @@ namespace MassTransit.Topology { + using System; + + public interface IHostTopology : IBusTopology { + Uri HostAddress { get; } } } diff --git a/src/MassTransit/Topology/Topologies/HostTopology.cs b/src/MassTransit/Topology/Topologies/HostTopology.cs index 1a580290fa0..65b5e568af5 100644 --- a/src/MassTransit/Topology/Topologies/HostTopology.cs +++ b/src/MassTransit/Topology/Topologies/HostTopology.cs @@ -2,14 +2,11 @@ { using System; using Configuration; - using Util; public abstract class HostTopology : IHostTopology { - protected static readonly INewIdFormatter Formatter = FormatUtil.Formatter; - readonly IHostConfiguration _hostConfiguration; readonly ITopologyConfiguration _topologyConfiguration; @@ -22,6 +19,8 @@ protected HostTopology(IHostConfiguration hostConfiguration, ITopologyConfigurat public IPublishTopology PublishTopology => _topologyConfiguration.Publish; public ISendTopology SendTopology => _topologyConfiguration.Send; + public Uri HostAddress => _hostConfiguration.HostAddress; + public IMessagePublishTopology Publish() where T : class { diff --git a/src/Transports/MassTransit.ActiveMqTransport/Topology/Topologies/ActiveMqHostTopology.cs b/src/Transports/MassTransit.ActiveMqTransport/Topology/Topologies/ActiveMqHostTopology.cs index 1f5da7637b9..5fa1a1c4273 100644 --- a/src/Transports/MassTransit.ActiveMqTransport/Topology/Topologies/ActiveMqHostTopology.cs +++ b/src/Transports/MassTransit.ActiveMqTransport/Topology/Topologies/ActiveMqHostTopology.cs @@ -58,8 +58,6 @@ public Uri GetDestinationAddress(Type messageType, Action co _topologyConfiguration.Publish.TryGetPublishAddress(messageType, _hostConfiguration.HostAddress, out var address); - // var address = new ActiveMqEndpointAddress(_hostConfiguration.HostAddress, new Uri($"topic:{queueName}?temporary={isTemporary}")); - var settings = new TopicSendSettings(new ActiveMqEndpointAddress(_hostConfiguration.HostAddress, address)); if (isTemporary) { diff --git a/src/Transports/MassTransit.AmazonSqsTransport/Topology/IAmazonSqsHostTopology.cs b/src/Transports/MassTransit.AmazonSqsTransport/Topology/IAmazonSqsHostTopology.cs index 721ce4b1b35..cd045f6c8f2 100644 --- a/src/Transports/MassTransit.AmazonSqsTransport/Topology/IAmazonSqsHostTopology.cs +++ b/src/Transports/MassTransit.AmazonSqsTransport/Topology/IAmazonSqsHostTopology.cs @@ -12,7 +12,7 @@ public interface IAmazonSqsHostTopology : new IAmazonSqsSendTopology SendTopology { get; } /// - /// Returns the destination address for the specified exchange + /// Returns the destination address for the specified topic /// /// /// Callback to configure exchange settings @@ -20,7 +20,7 @@ public interface IAmazonSqsHostTopology : Uri GetDestinationAddress(string topicName, Action configure = null); /// - /// Returns the destination address for the specified message type + /// Returns the destination address for the topic identified by the message type /// /// The message type /// Callback to configure exchange settings diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Configuration/Builders/ServiceBusReceiveEndpointBuilder.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Configuration/Builders/ServiceBusReceiveEndpointBuilder.cs index 2eb4eeced8a..3684212b6e2 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Configuration/Builders/ServiceBusReceiveEndpointBuilder.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Configuration/Builders/ServiceBusReceiveEndpointBuilder.cs @@ -2,8 +2,6 @@ { using System; using System.Linq; - using System.Security.Cryptography; - using System.Text; using Configuration; using Contexts; using GreenPipes; @@ -11,7 +9,6 @@ using Topology; using Topology.Builders; using Transport; - using Util; public class ServiceBusReceiveEndpointBuilder : @@ -56,28 +53,9 @@ public ServiceBusReceiveEndpointContext CreateReceiveEndpointContext() string GenerateSubscriptionName() { var subscriptionName = _configuration.Settings.Name.Split(Separator, StringSplitOptions.RemoveEmptyEntries).LastOrDefault(); + var hostScope = _configuration.HostAddress.AbsolutePath.Split(Separator, StringSplitOptions.RemoveEmptyEntries).LastOrDefault(); - var suffix = _configuration.HostAddress.AbsolutePath.Split(Separator, StringSplitOptions.RemoveEmptyEntries).LastOrDefault(); - if (!string.IsNullOrWhiteSpace(suffix)) - subscriptionName += $"-{suffix}"; - - string name; - if (subscriptionName.Length > 50) - { - string hashed; - using (var hasher = new SHA1Managed()) - { - byte[] buffer = Encoding.UTF8.GetBytes(subscriptionName); - byte[] hash = hasher.ComputeHash(buffer); - hashed = FormatUtil.Formatter.Format(hash).Substring(0, 6); - } - - name = $"{subscriptionName.Substring(0, 43)}-{hashed}"; - } - else - name = subscriptionName; - - return name; + return _configuration.Topology.Publish.GenerateSubscriptionName(subscriptionName, hostScope); } BrokerTopology BuildTopology(ReceiveSettings settings) diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Configuration/Configuration/ServiceBusHostConfiguration.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Configuration/Configuration/ServiceBusHostConfiguration.cs index b91c9ffb49d..74c6b9ad1cb 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Configuration/Configuration/ServiceBusHostConfiguration.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Configuration/Configuration/ServiceBusHostConfiguration.cs @@ -38,7 +38,7 @@ public ServiceBusHostConfiguration(IServiceBusBusConfiguration busConfiguration, _topologyConfiguration = topologyConfiguration; _hostSettings = new HostSettings(); - _hostTopology = new ServiceBusHostTopology(this, _topologyConfiguration, _messageNameFormatter); + _hostTopology = new ServiceBusHostTopology(this, _topologyConfiguration); _connectionContextSupervisor = new ServiceBusConnectionContextSupervisor(this, topologyConfiguration); } diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Builders/BrokerTopologyBuilder.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Builders/BrokerTopologyBuilder.cs index a300803f28b..7546f930041 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Builders/BrokerTopologyBuilder.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Builders/BrokerTopologyBuilder.cs @@ -7,12 +7,12 @@ namespace MassTransit.Azure.ServiceBus.Core.Topology.Builders using Microsoft.Azure.ServiceBus.Management; - public abstract class BrokerTopologyBuilder : + public class BrokerTopologyBuilder : IBrokerTopologyBuilder { long _nextId; - protected BrokerTopologyBuilder() + public BrokerTopologyBuilder() { Topics = new NamedEntityCollection(TopicEntity.EntityComparer, TopicEntity.NameComparer); Queues = new NamedEntityCollection(QueueEntity.EntityComparer, QueueEntity.NameComparer); diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Builders/PublishEndpointBrokerTopologyBuilder.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Builders/PublishEndpointBrokerTopologyBuilder.cs index 8d69859ef7d..ac3dd338d6f 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Builders/PublishEndpointBrokerTopologyBuilder.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Builders/PublishEndpointBrokerTopologyBuilder.cs @@ -2,12 +2,9 @@ namespace MassTransit.Azure.ServiceBus.Core.Topology.Builders { using System; using System.Linq; - using System.Security.Cryptography; - using System.Text; using Entities; using Microsoft.Azure.ServiceBus; using Microsoft.Azure.ServiceBus.Management; - using Util; public class PublishEndpointBrokerTopologyBuilder : @@ -22,10 +19,12 @@ public enum Options } + readonly IServiceBusPublishTopology _topology; readonly Options _options; - public PublishEndpointBrokerTopologyBuilder(Options options = Options.MaintainHierarchy) + public PublishEndpointBrokerTopologyBuilder(IServiceBusPublishTopology topology, Options options = Options.MaintainHierarchy) { + _topology = topology; _options = options; } @@ -37,7 +36,7 @@ public PublishEndpointBrokerTopologyBuilder(Options options = Options.MaintainHi public IPublishEndpointBrokerTopologyBuilder CreateImplementedBuilder() { if (_options.HasFlag(Options.MaintainHierarchy)) - return new ImplementedBuilder(this, _options); + return new ImplementedBuilder(this, _topology, _options); return this; } @@ -47,12 +46,14 @@ class ImplementedBuilder : IPublishEndpointBrokerTopologyBuilder { readonly IPublishEndpointBrokerTopologyBuilder _builder; + readonly IServiceBusPublishTopology _topology; readonly Options _options; TopicHandle _topic; - public ImplementedBuilder(IPublishEndpointBrokerTopologyBuilder builder, Options options) + public ImplementedBuilder(IPublishEndpointBrokerTopologyBuilder builder, IServiceBusPublishTopology topology, Options options) { _builder = builder; + _topology = topology; _options = options; } @@ -66,7 +67,7 @@ public TopicHandle Topic { var subscriptionName = string.Join("-", value.Topic.TopicDescription.Path.Split('/').Reverse()); var subscriptionDescription = new SubscriptionDescription(_builder.Topic.Topic.TopicDescription.Path, - GenerateSubscriptionName(subscriptionName)) {ForwardTo = value.Topic.TopicDescription.Path}; + _topology.FormatSubscriptionName(subscriptionName)) {ForwardTo = value.Topic.TopicDescription.Path}; _builder.CreateTopicSubscription(_builder.Topic, _topic, subscriptionDescription); } @@ -75,10 +76,7 @@ public TopicHandle Topic public IPublishEndpointBrokerTopologyBuilder CreateImplementedBuilder() { - if (_options.HasFlag(Options.MaintainHierarchy)) - return new ImplementedBuilder(this, _options); - - return this; + return _options.HasFlag(Options.MaintainHierarchy) ? new ImplementedBuilder(this, _topology, _options) : this; } public TopicHandle CreateTopic(TopicDescription topicDescription) @@ -108,27 +106,6 @@ public QueueSubscriptionHandle CreateQueueSubscription(TopicHandle exchange, Que { return _builder.CreateQueueSubscription(exchange, queue, subscriptionDescription, rule, filter); } - - string GenerateSubscriptionName(string subscriptionName) - { - string name; - if (subscriptionName.Length > 50) - { - string hashed; - using (var hasher = new SHA1Managed()) - { - byte[] buffer = Encoding.UTF8.GetBytes(subscriptionName); - byte[] hash = hasher.ComputeHash(buffer); - hashed = FormatUtil.Formatter.Format(hash).Substring(0, 6); - } - - name = $"{subscriptionName.Substring(0, 43)}-{hashed}"; - } - else - name = subscriptionName; - - return name; - } } } } diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Configuration/Specifications/QueueSubscriptionConsumeTopologySpecification.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Configuration/Specifications/SubscriptionConsumeTopologySpecification.cs similarity index 59% rename from src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Configuration/Specifications/QueueSubscriptionConsumeTopologySpecification.cs rename to src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Configuration/Specifications/SubscriptionConsumeTopologySpecification.cs index 71cd11e5885..77447c8244c 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Configuration/Specifications/QueueSubscriptionConsumeTopologySpecification.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Configuration/Specifications/SubscriptionConsumeTopologySpecification.cs @@ -1,14 +1,10 @@ namespace MassTransit.Azure.ServiceBus.Core.Topology.Specifications { using System.Collections.Generic; - using System.Linq; - using System.Security.Cryptography; - using System.Text; using Builders; using GreenPipes; using Microsoft.Azure.ServiceBus; using Microsoft.Azure.ServiceBus.Management; - using Util; /// @@ -43,33 +39,8 @@ public void Apply(IReceiveEndpointBrokerTopologyBuilder builder) var subscriptionDescription = _subscriptionDescription; subscriptionDescription.ForwardTo = builder.Queue.Queue.QueueDescription.Path; - subscriptionDescription.SubscriptionName = - GetSubscriptionName(subscriptionDescription.SubscriptionName, builder.Queue.Queue.QueueDescription.Path.Split('/').Last()); builder.CreateQueueSubscription(topic, builder.Queue, subscriptionDescription, _rule, _filter); } - - static string GetSubscriptionName(string subscriptionName, string queuePath) - { - var subscriptionPath = subscriptionName.Replace("{queuePath}", queuePath); - - string name; - if (subscriptionPath.Length > 50) - { - string hashed; - using (var hasher = new SHA1Managed()) - { - byte[] buffer = Encoding.UTF8.GetBytes(subscriptionPath); - byte[] hash = hasher.ComputeHash(buffer); - hashed = FormatUtil.Formatter.Format(hash).Substring(0, 6); - } - - name = $"{subscriptionPath.Substring(0, 43)}-{hashed}"; - } - else - name = subscriptionPath; - - return name; - } } } diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/IServiceBusHostTopology.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/IServiceBusHostTopology.cs index 98f18fa8700..538c94e32df 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/IServiceBusHostTopology.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/IServiceBusHostTopology.cs @@ -18,19 +18,11 @@ public interface IServiceBusHostTopology : where T : class; /// - /// Returns the destination address for the specified exchange + /// Returns the destination address for the specified queue /// /// /// Callback to configure queue settings /// Uri GetDestinationAddress(string queueName, Action configure = null); - - /// - /// Returns the destination address for the specified message type - /// - /// The message type - /// Callback to configure exchange settings - /// - Uri GetDestinationAddress(Type messageType, Action configure = null); } } diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/IServiceBusMessagePublishTopology.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/IServiceBusMessagePublishTopology.cs index 7f5d6ccd2e6..8783096360f 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/IServiceBusMessagePublishTopology.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/IServiceBusMessagePublishTopology.cs @@ -1,6 +1,7 @@ namespace MassTransit.Azure.ServiceBus.Core.Topology { using Builders; + using Configurators; using MassTransit.Topology; using Microsoft.Azure.ServiceBus.Management; using Transport; @@ -17,6 +18,8 @@ public interface IServiceBusMessagePublishTopology : TopicDescription TopicDescription { get; } SendSettings GetSendSettings(); + + SubscriptionConfigurator GetSubscriptionConfigurator(string subscriptionName); } diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/IServiceBusPublishTopology.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/IServiceBusPublishTopology.cs index 1759fbf7bde..479bdbff327 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/IServiceBusPublishTopology.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/IServiceBusPublishTopology.cs @@ -8,5 +8,20 @@ public interface IServiceBusPublishTopology : { new IServiceBusMessagePublishTopology GetMessageTopology() where T : class; + + /// + /// Formats a subscription name to be 50 characters if it is greater than 50 characters. + /// + /// + /// + string FormatSubscriptionName(string name); + + /// + /// Generate a subscription name that is less than 50 characters, using the entity name and host address + /// + /// The entity name of the destination queue or topic + /// The absolute path of the host, which is usually the scope + /// + string GenerateSubscriptionName(string entityName, string hostScope = default); } } diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusConsumeTopology.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusConsumeTopology.cs index 7cba54d8b70..127b864f5de 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusConsumeTopology.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusConsumeTopology.cs @@ -52,6 +52,8 @@ public void Subscribe(string topicName, string subscriptionName, Action _configuration.Publish; @@ -38,20 +32,6 @@ public Uri GetDestinationAddress(string queueName, Action co return configurator.GetQueueAddress(_hostConfiguration.HostAddress); } - public Uri GetDestinationAddress(Type messageType, Action configure = null) - { - var queueName = _messageNameFormatter.GetMessageName(messageType).ToString(); - - var configurator = new QueueConfigurator(queueName); - - if (TypeMetadataCache.IsTemporaryMessageType(messageType)) - configurator.AutoDeleteOnIdle = Defaults.TemporaryAutoDeleteOnIdle; - - configure?.Invoke(configurator); - - return configurator.GetQueueAddress(_hostConfiguration.HostAddress); - } - IServiceBusMessagePublishTopology IServiceBusHostTopology.Publish() { return _configuration.Publish.GetMessageTopology(); diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusMessageConsumeTopology.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusMessageConsumeTopology.cs index d24baa9f8cd..6c646433af5 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusMessageConsumeTopology.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusMessageConsumeTopology.cs @@ -4,7 +4,6 @@ namespace MassTransit.Azure.ServiceBus.Core.Topology.Topologies using System.Collections.Generic; using System.Linq; using Builders; - using Configurators; using GreenPipes; using MassTransit.Topology; using MassTransit.Topology.Topologies; @@ -49,7 +48,7 @@ public void Subscribe(string subscriptionName, Action var topicDescription = _publishTopology.TopicDescription; - var subscriptionConfigurator = new SubscriptionConfigurator(topicDescription.Path, subscriptionName); + var subscriptionConfigurator = _publishTopology.GetSubscriptionConfigurator(subscriptionName); configure?.Invoke(subscriptionConfigurator); diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusMessagePublishTopology.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusMessagePublishTopology.cs index 4e5949b2bc1..a84f5fe0b87 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusMessagePublishTopology.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusMessagePublishTopology.cs @@ -19,12 +19,14 @@ public class ServiceBusMessagePublishTopology : { readonly IList _implementedMessageTypes; readonly IMessageTopology _messageTopology; + readonly IServiceBusPublishTopology _publishTopology; readonly TopicConfigurator _topicConfigurator; readonly Lazy _topicDescription; - public ServiceBusMessagePublishTopology(IMessageTopology messageTopology) + public ServiceBusMessagePublishTopology(IMessageTopology messageTopology, IServiceBusPublishTopology publishTopology) { _messageTopology = messageTopology; + _publishTopology = publishTopology; _topicDescription = new Lazy(GetTopicDescription); @@ -44,13 +46,18 @@ public SendSettings GetSendSettings() { var description = GetTopicDescription(); - var builder = new PublishEndpointBrokerTopologyBuilder(); + var builder = new PublishEndpointBrokerTopologyBuilder(_publishTopology); Apply(builder); return new TopicSendSettings(description, builder.BuildBrokerTopology()); } + public SubscriptionConfigurator GetSubscriptionConfigurator(string subscriptionName) + { + return new SubscriptionConfigurator(TopicDescription.Path, _publishTopology.FormatSubscriptionName(subscriptionName)); + } + string IMessageEntityConfigurator.Path => _topicConfigurator.Path; string IMessageEntityConfigurator.BasePath diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusPublishTopology.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusPublishTopology.cs index 9a50361ce27..450d261f15c 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusPublishTopology.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusPublishTopology.cs @@ -1,9 +1,12 @@ namespace MassTransit.Azure.ServiceBus.Core.Topology.Topologies { using System; + using System.Security.Cryptography; + using System.Text; using MassTransit.Topology; using MassTransit.Topology.Topologies; using Metadata; + using Util; public class ServiceBusPublishTopology : @@ -22,6 +25,35 @@ IServiceBusMessagePublishTopology IServiceBusPublishTopology.GetMessageTopolo return GetMessageTopology() as IServiceBusMessagePublishTopologyConfigurator; } + public string FormatSubscriptionName(string subscriptionName) + { + string name; + if (subscriptionName.Length > 50) + { + string hashed; + using (var hasher = new SHA1Managed()) + { + byte[] buffer = Encoding.UTF8.GetBytes(subscriptionName); + byte[] hash = hasher.ComputeHash(buffer); + hashed = FormatUtil.Formatter.Format(hash).Substring(0, 6); + } + + name = $"{subscriptionName.Substring(0, 43)}-{hashed}"; + } + else + name = subscriptionName; + + return name; + } + + public string GenerateSubscriptionName(string entityName, string hostScope) + { + if (entityName == null) + throw new ArgumentNullException(nameof(entityName)); + + return FormatSubscriptionName(string.IsNullOrWhiteSpace(hostScope) ? entityName : $"{entityName}-{hostScope}"); + } + IServiceBusMessagePublishTopologyConfigurator IServiceBusPublishTopologyConfigurator.GetMessageTopology() { return GetMessageTopology() as IServiceBusMessagePublishTopologyConfigurator; @@ -29,7 +61,7 @@ IServiceBusMessagePublishTopologyConfigurator IServiceBusPublishTopologyConfi protected override IMessagePublishTopologyConfigurator CreateMessageTopology(Type type) { - var messageTopology = new ServiceBusMessagePublishTopology(_messageTopology.GetMessageTopology()); + var messageTopology = new ServiceBusMessagePublishTopology(_messageTopology.GetMessageTopology(), this); var connector = new ImplementedMessageTypeConnector(this, messageTopology); diff --git a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusSendTopology.cs b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusSendTopology.cs index 36d55d4ee9a..13b4f1be912 100644 --- a/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusSendTopology.cs +++ b/src/Transports/MassTransit.Azure.ServiceBus.Core/Topology/Topologies/ServiceBusSendTopology.cs @@ -38,10 +38,11 @@ public SendSettings GetSendSettings(ServiceBusEndpointAddress address) return new QueueSendSettings(queueDescription); } + var topicDescription = GetTopicDescription(address); - var builder = new PublishEndpointBrokerTopologyBuilder(); - builder.Topic = builder.CreateTopic(topicDescription); + var builder = new BrokerTopologyBuilder(); + builder.CreateTopic(topicDescription); return new TopicSendSettings(topicDescription, builder.BuildBrokerTopology()); } diff --git a/tests/MassTransit.Azure.ServiceBus.Core.Tests/BuildTopology_Specs.cs b/tests/MassTransit.Azure.ServiceBus.Core.Tests/BuildTopology_Specs.cs index 1fd83579e83..914b6226f2a 100644 --- a/tests/MassTransit.Azure.ServiceBus.Core.Tests/BuildTopology_Specs.cs +++ b/tests/MassTransit.Azure.ServiceBus.Core.Tests/BuildTopology_Specs.cs @@ -220,7 +220,7 @@ public void Setup() _entityNameFormatter = new MessageNameFormatterEntityNameFormatter(_nameFormatter); _publishTopology = new ServiceBusPublishTopology(AzureBusFactory.MessageTopology); - _builder = new PublishEndpointBrokerTopologyBuilder(); + _builder = new PublishEndpointBrokerTopologyBuilder(_publishTopology); } ServiceBusMessageNameFormatter _nameFormatter; @@ -307,7 +307,7 @@ public void Setup() _entityNameFormatter = new MessageNameFormatterEntityNameFormatter(_nameFormatter); _publishTopology = new ServiceBusPublishTopology(AzureBusFactory.MessageTopology); - _builder = new PublishEndpointBrokerTopologyBuilder(); + _builder = new PublishEndpointBrokerTopologyBuilder(_publishTopology); } ServiceBusMessageNameFormatter _nameFormatter; diff --git a/tests/MassTransit.Azure.ServiceBus.Core.Tests/LockTimeout_Specs.cs b/tests/MassTransit.Azure.ServiceBus.Core.Tests/LockTimeout_Specs.cs index 50b2a076127..fbf6f951933 100644 --- a/tests/MassTransit.Azure.ServiceBus.Core.Tests/LockTimeout_Specs.cs +++ b/tests/MassTransit.Azure.ServiceBus.Core.Tests/LockTimeout_Specs.cs @@ -11,7 +11,7 @@ public class Renewing_a_lock_on_an_existing_message : AzureServiceBusTestFixture { - [Test] + [Test, Explicit] public async Task Should_complete_the_consumer() { var context = await PingConsumer.Completed.Task;