Skip to content

Commit 4330588

Browse files
authored
Merge pull request #4143 from MikeFreeman-Flagstone/feat/4142-surface-sequence-number
2 parents ecb6ba1 + 12eb2a9 commit 4330588

6 files changed

Lines changed: 92 additions & 0 deletions

File tree

src/Paramore.Brighter.MessagingGateway.AzureServiceBus/ASBConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
internal static class ASBConstants
44
{
55
public const string LockTokenHeaderBagKey = "LockToken";
6+
public const string SequenceNumberBagKey = "SequenceNumber";
67
public const string MessageTypeHeaderBagKey = "MessageType";
78
public const string HandledCountHeaderBagKey = "HandledCount";
89
public const string ReplyToHeaderBagKey = "ReplyTo";

src/Paramore.Brighter.MessagingGateway.AzureServiceBus/AzureServiceBusMesssageCreator.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ public Message MapToBrighterMessage(IBrokeredMessageWrapper? azureServiceBusMess
107107
);
108108

109109
headers.Bag.Add(ASBConstants.LockTokenHeaderBagKey, azureServiceBusMessage.LockToken);
110+
headers.Bag.Add(ASBConstants.SequenceNumberBagKey, azureServiceBusMessage.SequenceNumber);
110111

111112
foreach (var property in azureServiceBusMessage.ApplicationProperties)
112113
{

src/Paramore.Brighter.MessagingGateway.AzureServiceBus/AzureServiceBusWrappers/BrokeredMessageWrapper.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public BrokeredMessageWrapper(ServiceBusReceivedMessage brokeredMessage)
2121

2222
public string LockToken => _brokeredMessage.LockToken;
2323

24+
public long SequenceNumber => _brokeredMessage.SequenceNumber;
25+
2426
public string Id => _brokeredMessage.MessageId;
2527

2628
public string CorrelationId

src/Paramore.Brighter.MessagingGateway.AzureServiceBus/AzureServiceBusWrappers/IBrokeredMessageWrapper.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ public interface IBrokeredMessageWrapper
2828
/// </summary>
2929
string LockToken { get; }
3030

31+
/// <summary>
32+
/// The broker-assigned sequence number. Uniquely identifies a message within a Service Bus entity.
33+
/// </summary>
34+
long SequenceNumber { get; }
35+
3136
/// <summary>
3237
/// The message Id.
3338
/// </summary>
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using Paramore.Brighter.AzureServiceBus.Tests.TestDoubles;
5+
using Paramore.Brighter.MessagingGateway.AzureServiceBus;
6+
using Xunit;
7+
8+
// ASBConstants is internal to the gateway assembly; tests use the agreed
9+
// public contract string directly so they act as a stability guard too.
10+
11+
namespace Paramore.Brighter.AzureServiceBus.Tests.MessagingGateway;
12+
13+
[Trait("Category", "ASB")]
14+
public class AzureServiceBusMessageSequenceNumberTests
15+
{
16+
private readonly AzureServiceBusMesssageCreator _creator;
17+
18+
public AzureServiceBusMessageSequenceNumberTests()
19+
{
20+
var subscription = new AzureServiceBusSubscription<ASBTestCommand>(
21+
subscriptionName: new SubscriptionName("test-sub"),
22+
channelName: new ChannelName("test-channel"),
23+
routingKey: new RoutingKey("test-topic"),
24+
messagePumpType: MessagePumpType.Reactor);
25+
26+
_creator = new AzureServiceBusMesssageCreator(subscription);
27+
}
28+
29+
[Fact]
30+
public void When_mapping_a_message_the_sequence_number_is_added_to_the_header_bag()
31+
{
32+
// Arrange
33+
const long expectedSequenceNumber = 12345678L;
34+
35+
var brokeredMessage = new BrokeredMessage
36+
{
37+
MessageBodyValue = Encoding.UTF8.GetBytes("{\"key\":\"value\"}"),
38+
ApplicationProperties = new Dictionary<string, object>
39+
{
40+
{ "MessageType", "MT_EVENT" }
41+
},
42+
LockToken = Guid.NewGuid().ToString(),
43+
SequenceNumber = expectedSequenceNumber,
44+
Id = Guid.NewGuid().ToString(),
45+
CorrelationId = Guid.NewGuid().ToString(),
46+
ContentType = "application/json"
47+
};
48+
49+
// Act
50+
var message = _creator.MapToBrighterMessage(brokeredMessage);
51+
52+
// Assert
53+
Assert.True(message.Header.Bag.ContainsKey("SequenceNumber"));
54+
Assert.Equal(expectedSequenceNumber, message.Header.Bag["SequenceNumber"]);
55+
}
56+
57+
[Fact]
58+
public void When_mapping_a_message_with_a_zero_sequence_number_it_is_still_present_in_the_bag()
59+
{
60+
// Arrange
61+
var brokeredMessage = new BrokeredMessage
62+
{
63+
MessageBodyValue = Encoding.UTF8.GetBytes("{}"),
64+
ApplicationProperties = new Dictionary<string, object>
65+
{
66+
{ "MessageType", "MT_EVENT" }
67+
},
68+
LockToken = Guid.NewGuid().ToString(),
69+
SequenceNumber = 0L,
70+
Id = Guid.NewGuid().ToString(),
71+
CorrelationId = Guid.NewGuid().ToString(),
72+
ContentType = "application/json"
73+
};
74+
75+
// Act
76+
var message = _creator.MapToBrighterMessage(brokeredMessage);
77+
78+
// Assert
79+
Assert.True(message.Header.Bag.ContainsKey("SequenceNumber"));
80+
Assert.Equal(0L, message.Header.Bag["SequenceNumber"]);
81+
}
82+
}

tests/Paramore.Brighter.AzureServiceBus.Tests/TestDoubles/BrokeredMessage.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class BrokeredMessage : IBrokeredMessageWrapper
1010
public ReadOnlyMemory<byte> MessageBodyMemory => (MessageBodyValue ?? Array.Empty<byte>()).AsMemory();
1111
public IReadOnlyDictionary<string, object> ApplicationProperties { get; init; }
1212
public string LockToken { get; init;}
13+
public long SequenceNumber { get; init; }
1314
public string Id { get; init;}
1415
public string CorrelationId { get; init;}
1516
public string ContentType { get; init;}

0 commit comments

Comments
 (0)