Skip to content

Commit 2a66c8e

Browse files
Fix issue related to receiver/sender caching (#30400)
1 parent 873d4dc commit 2a66c8e

File tree

4 files changed

+48
-6
lines changed

4 files changed

+48
-6
lines changed

sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/CHANGELOG.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# Release History
22

3-
## 5.7.0-beta.1 (Unreleased)
3+
## 5.7.0 (2022-08-09)
44

55
### Features Added
66

7-
### Breaking Changes
7+
- Added distributed tracing span when for functions that process a batch of messages.
88

99
### Bugs Fixed
1010

11-
### Other Changes
11+
- Fixed issue related to function apps that are bound to multiple namespaces using the same entity names, which caused messages to not be processed from the second namespace.
1212

1313
## 5.6.0 (2022-07-28)
1414

sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/src/Microsoft.Azure.WebJobs.Extensions.ServiceBus.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<TargetFrameworks>netstandard2.0</TargetFrameworks>
55
<Description>Microsoft Azure WebJobs SDK ServiceBus Extension</Description>
6-
<Version>5.7.0-beta.1</Version>
6+
<Version>5.7.0</Version>
77
<!--The ApiCompatVersion is managed automatically and should not generally be modified manually.-->
88
<ApiCompatVersion>5.6.0</ApiCompatVersion>
99
<NoWarn>$(NoWarn);AZC0001;CS1591;SA1636</NoWarn>

sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/src/Primitives/MessagingProvider.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ protected internal virtual ServiceBusSender CreateMessageSender(ServiceBusClient
139139
Argument.AssertNotNull(client, nameof(client));
140140
Argument.AssertNotNullOrEmpty(entityPath, nameof(entityPath));
141141

142-
return _messageSenderCache.GetOrAdd(entityPath, client.CreateSender(entityPath));
142+
return _messageSenderCache.GetOrAdd(GenerateCacheKey(client.FullyQualifiedNamespace, entityPath), client.CreateSender(entityPath));
143143
}
144144

145145
/// <summary>
@@ -158,7 +158,7 @@ protected internal virtual ServiceBusReceiver CreateBatchMessageReceiver(Service
158158
Argument.AssertNotNullOrEmpty(entityPath, nameof(entityPath));
159159
Argument.AssertNotNull(options, nameof(options));
160160

161-
return _messageReceiverCache.GetOrAdd(entityPath, (_) => client.CreateReceiver(entityPath, options));
161+
return _messageReceiverCache.GetOrAdd(GenerateCacheKey(client.FullyQualifiedNamespace, entityPath), (_) => client.CreateReceiver(entityPath, options));
162162
}
163163

164164
/// <summary>
@@ -212,5 +212,10 @@ protected internal virtual ServiceBusSessionProcessor CreateSessionProcessor(Ser
212212
processor.SessionClosingAsync += Options.SessionClosingHandler;
213213
return processor;
214214
}
215+
216+
private static string GenerateCacheKey(string fullyQualifiedNamespace, string entityPath)
217+
{
218+
return $"{fullyQualifiedNamespace}/{entityPath}";
219+
}
215220
}
216221
}

sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/tests/MessagingProviderTests.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ public class MessagingProviderTests
1818
private static string _defaultConnection = "Endpoint=sb://default.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=abc123=";
1919
private static ServiceBusClient _client = new(_defaultConnection);
2020

21+
private static string _secondaryConnection = "Endpoint=sb://default2.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=abc123=";
22+
private static ServiceBusClient _secondaryClient = new(_secondaryConnection);
23+
2124
[Test]
2225
public void CreateMessageReceiver_ReturnsExpectedReceiver()
2326
{
@@ -97,6 +100,40 @@ public void CreateMessageSender_ReturnsExpectedSender()
97100
Assert.AreSame(sender, sender2);
98101
}
99102

103+
[Test]
104+
public void CreateMessageSender_MultipleNamespacesWithSameEntityName_ReturnsCorrectSender()
105+
{
106+
var options = new ServiceBusOptions();
107+
108+
var provider = new MessagingProvider(new OptionsWrapper<ServiceBusOptions>(options));
109+
110+
var sender1 = provider.CreateMessageSender(_client, "entityPath");
111+
Assert.AreEqual("entityPath", sender1.EntityPath);
112+
Assert.AreEqual(_client.FullyQualifiedNamespace, sender1.FullyQualifiedNamespace);
113+
114+
var sender2 = provider.CreateMessageSender(_secondaryClient, "entityPath");
115+
Assert.AreNotSame(sender1, sender2);
116+
Assert.AreEqual("entityPath", sender2.EntityPath);
117+
Assert.AreEqual(_secondaryClient.FullyQualifiedNamespace, sender2.FullyQualifiedNamespace);
118+
}
119+
120+
[Test]
121+
public void CreateMessageReceiver_MultipleNamespacesWithSameEntityName_ReturnsCorrectReceiver()
122+
{
123+
var options = new ServiceBusOptions();
124+
125+
var provider = new MessagingProvider(new OptionsWrapper<ServiceBusOptions>(options));
126+
127+
var receiver1 = provider.CreateBatchMessageReceiver(_client, "entityPath", new ServiceBusReceiverOptions());
128+
Assert.AreEqual("entityPath", receiver1.EntityPath);
129+
Assert.AreEqual(_client.FullyQualifiedNamespace, receiver1.FullyQualifiedNamespace);
130+
131+
var receiver2 = provider.CreateBatchMessageReceiver(_secondaryClient, "entityPath", new ServiceBusReceiverOptions());
132+
Assert.AreNotSame(receiver1, receiver2);
133+
Assert.AreEqual("entityPath", receiver2.EntityPath);
134+
Assert.AreEqual(_secondaryClient.FullyQualifiedNamespace, receiver2.FullyQualifiedNamespace);
135+
}
136+
100137
private IConfiguration CreateConfiguration(params KeyValuePair<string, string>[] data)
101138
{
102139
return new ConfigurationBuilder().AddInMemoryCollection(data).Build();

0 commit comments

Comments
 (0)