Skip to content
This repository was archived by the owner on Oct 12, 2023. It is now read-only.

Commit d70d83e

Browse files
committed
Merge branch 'dev'
2 parents 9b22eab + d478a3c commit d70d83e

File tree

7 files changed

+86
-12
lines changed

7 files changed

+86
-12
lines changed

src/Microsoft.Azure.ServiceBus/Microsoft.Azure.ServiceBus.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<Description>This is the next generation Azure Service Bus .NET Standard client library that focuses on queues &amp; topics. For more information about Service Bus, see https://azure.microsoft.com/en-us/services/service-bus/</Description>
5-
<Version>3.2.0</Version>
5+
<Version>3.2.1</Version>
66
<Authors>Microsoft</Authors>
77
<copyright>© Microsoft Corporation. All rights reserved.</copyright>
88
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
@@ -27,7 +27,7 @@
2727
</PropertyGroup>
2828

2929
<ItemGroup>
30-
<PackageReference Include="Microsoft.Azure.Amqp" Version="[2.3.5, 3.0.0)" />
30+
<PackageReference Include="Microsoft.Azure.Amqp" Version="[2.3.7, 3.0.0)" />
3131
<PackageReference Include="Microsoft.Azure.Services.AppAuthentication" Version="[1.0.1, 2.0.0)" />
3232
<PackageReference Include="Microsoft.IdentityModel.Clients.ActiveDirectory" Version="[3.17.2, 5.0.0)" />
3333
<PackageReference Include="System.Diagnostics.DiagnosticSource" Version="4.4.1" />

src/Microsoft.Azure.ServiceBus/RetryExponential.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ namespace Microsoft.Azure.ServiceBus
88

99
/// <summary>
1010
/// RetryPolicy implementation where the delay between retries will grow in a staggered exponential manner.
11-
/// RetryIntervals will be computed using a retryFactor which is a function of deltaBackOff (MaximumBackoff - MinimumBackoff) and MaximumRetryCount
11+
/// RetryIntervals will be computed using a retryFactor which is a function of deltaBackOff (MaximumBackoff - MinimumBackoff) and MaximumRetryCount.
12+
/// <remarks>RetryPolicy will not be applied when an ambient transaction is found.</remarks>
1213
/// </summary>
1314
public sealed class RetryExponential : RetryPolicy
1415
{

src/Microsoft.Azure.ServiceBus/RetryPolicy.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ namespace Microsoft.Azure.ServiceBus
66
using System;
77
using System.Collections.Generic;
88
using System.Threading.Tasks;
9+
using System.Transactions;
910
using Primitives;
1011

1112
/// <summary>
1213
/// Represents an abstraction for retrying messaging operations. Users should not
1314
/// implement this class, and instead should use one of the provided implementations.
15+
/// <remarks>RetryPolicy will not be applied when an ambient transaction is found.</remarks>
1416
/// </summary>
1517
public abstract class RetryPolicy
1618
{
@@ -124,9 +126,9 @@ public virtual bool IsRetryableException(Exception exception)
124126

125127
internal bool ShouldRetry(TimeSpan remainingTime, int currentRetryCount, Exception lastException, out TimeSpan retryInterval)
126128
{
127-
if (lastException == null)
129+
// There is no exception information or there's there's an ambient transaction - should not retry
130+
if (lastException == null || Transaction.Current != null)
128131
{
129-
// there are no exceptions.
130132
retryInterval = TimeSpan.Zero;
131133
return false;
132134
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
namespace Microsoft.Azure.ServiceBus.UnitTests
2+
{
3+
using System;
4+
using System.Threading.Tasks;
5+
using System.Transactions;
6+
using Xunit;
7+
8+
public class RetryPolicyTests
9+
{
10+
[Fact]
11+
[DisplayTestMethodName]
12+
public async Task Should_retry_when_throttled_and_no_ambient_transaction_is_detected()
13+
{
14+
var retryPolicy = RetryPolicy.Default;
15+
16+
var numberOfExecutions = 0;
17+
18+
await retryPolicy.RunOperation(() =>
19+
{
20+
if (numberOfExecutions > 1)
21+
{
22+
return Task.CompletedTask;
23+
}
24+
25+
numberOfExecutions++;
26+
27+
throw new ServerBusyException("Rico KABOOM!");
28+
}, TimeSpan.FromSeconds(30));
29+
30+
Assert.Equal(2, numberOfExecutions);
31+
}
32+
33+
[Fact]
34+
[DisplayTestMethodName]
35+
public async Task Should_not_retry_when_throttled_and_ambient_transaction_is_detected()
36+
{
37+
var retryPolicy = RetryPolicy.Default;
38+
var numberOfExecutions = 0;
39+
40+
using (var tx = new TransactionScope(TransactionScopeOption.RequiresNew, TransactionScopeAsyncFlowOption.Enabled))
41+
{
42+
await Assert.ThrowsAsync<ServerBusyException>(() =>
43+
retryPolicy.RunOperation(() =>
44+
{
45+
if (numberOfExecutions > 1)
46+
{
47+
return Task.CompletedTask;
48+
}
49+
50+
numberOfExecutions++;
51+
52+
throw new ServerBusyException("Rico KABOOM!");
53+
}, TimeSpan.FromSeconds(30)));
54+
}
55+
56+
Assert.Equal(1, numberOfExecutions);
57+
}
58+
}
59+
}

test/Microsoft.Azure.ServiceBus.UnitTests/SenderReceiverClientTestBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ internal async Task PeekLockTestCase(IMessageSender messageSender, IMessageRecei
2525
internal async Task ReceiveDeleteTestCase(IMessageSender messageSender, IMessageReceiver messageReceiver, int messageCount)
2626
{
2727
await TestUtility.SendMessagesAsync(messageSender, messageCount);
28-
var receivedMessages = await TestUtility.ReceiveMessagesAsync(messageReceiver, messageCount);
29-
Assert.True(messageCount == receivedMessages.Count);
28+
var receivedMessages = await TestUtility.ReceiveMessagesAsync(messageReceiver, messageCount, TimeSpan.FromSeconds(10));
29+
Assert.Equal(receivedMessages.Count, messageCount);
3030
}
3131

3232
internal async Task PeekLockWithAbandonTestCase(IMessageSender messageSender, IMessageReceiver messageReceiver, int messageCount)

test/Microsoft.Azure.ServiceBus.UnitTests/TestConstants.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33

44
namespace Microsoft.Azure.ServiceBus.UnitTests
55
{
6+
using System;
7+
68
static class TestConstants
79
{
810
internal const int MaxAttemptsCount = 5;
11+
internal readonly static TimeSpan WaitTimeBetweenAttempts = TimeSpan.FromSeconds(1);
912

1013
internal const string ConnectionStringEnvironmentVariable = "azure-service-bus-dotnet/connectionstring";
1114

test/Microsoft.Azure.ServiceBus.UnitTests/TestUtility.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,27 @@ internal static async Task SendMessagesAsync(IMessageSender messageSender, int m
6767
Log($"Sent {messageCount} messages");
6868
}
6969

70-
internal static async Task<IList<Message>> ReceiveMessagesAsync(IMessageReceiver messageReceiver, int messageCount)
70+
internal static async Task<IList<Message>> ReceiveMessagesAsync(IMessageReceiver messageReceiver, int messageCount, TimeSpan timeout = default)
7171
{
7272
var receiveAttempts = 0;
7373
var messagesToReturn = new List<Message>();
74+
var stopwatch = Stopwatch.StartNew();
7475

75-
while (receiveAttempts++ < TestConstants.MaxAttemptsCount && messagesToReturn.Count < messageCount)
76+
if (timeout == default)
77+
{
78+
timeout = TimeSpan.Zero;
79+
}
80+
81+
while (messagesToReturn.Count < messageCount && (receiveAttempts++ < TestConstants.MaxAttemptsCount || stopwatch.Elapsed < timeout))
7682
{
7783
var messages = await messageReceiver.ReceiveAsync(messageCount - messagesToReturn.Count);
78-
if (messages != null)
84+
if (messages == null)
7985
{
80-
messagesToReturn.AddRange(messages);
86+
await Task.Delay(TestConstants.WaitTimeBetweenAttempts);
87+
continue;
8188
}
89+
90+
messagesToReturn.AddRange(messages);
8291
}
8392

8493
VerifyUniqueMessages(messagesToReturn);
@@ -98,7 +107,7 @@ internal static async Task<IList<Message>> ReceiveDeferredMessagesAsync(IMessage
98107
var msg = await messageReceiver.ReceiveDeferredMessageAsync(sequenceNumber);
99108
if (msg != null)
100109
{
101-
messagesToReturn.Add(msg);
110+
messagesToReturn.Add(msg);
102111
}
103112
}
104113

0 commit comments

Comments
 (0)