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><profile version="1.0">
<option name="myName" value="Normal" />
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;