Skip to content

Commit 599559f

Browse files
Add AMQP constructor to ServiceBusMessage (Azure#37951)
1 parent 13bc415 commit 599559f

File tree

3 files changed

+54
-1
lines changed

3 files changed

+54
-1
lines changed

sdk/servicebus/Azure.Messaging.ServiceBus/api/Azure.Messaging.ServiceBus.netstandard2.0.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ public enum ServiceBusFailureReason
204204
public partial class ServiceBusMessage
205205
{
206206
public ServiceBusMessage() { }
207+
public ServiceBusMessage(Azure.Core.Amqp.AmqpAnnotatedMessage message) { }
207208
public ServiceBusMessage(Azure.Messaging.ServiceBus.ServiceBusReceivedMessage receivedMessage) { }
208209
public ServiceBusMessage(System.BinaryData body) { }
209210
public ServiceBusMessage(System.ReadOnlyMemory<byte> body) { }

sdk/servicebus/Azure.Messaging.ServiceBus/src/Primitives/ServiceBusMessage.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,15 @@ public ServiceBusMessage(ServiceBusReceivedMessage receivedMessage)
143143
}
144144
}
145145

146+
/// <summary>
147+
/// Creates a new message from the specified <see cref="AmqpAnnotatedMessage"/> instance.
148+
/// </summary>
149+
/// <param name="message">The AMQP message.</param>
150+
public ServiceBusMessage(AmqpAnnotatedMessage message)
151+
{
152+
AmqpMessage = message;
153+
}
154+
146155
/// <summary>
147156
/// Gets or sets the body of the message.
148157
/// </summary>
@@ -407,7 +416,7 @@ public DateTimeOffset ScheduledEnqueueTime
407416
internal AmqpAnnotatedMessage AmqpMessage { get; set; }
408417

409418
/// <summary>
410-
/// Gets the raw Amqp message data that will be transmitted over the wire.
419+
/// Gets the raw AMQP message data that will be transmitted over the wire.
411420
/// This can be used to enable scenarios that require setting AMQP header, footer, property, or annotation
412421
/// data that is not exposed as top level properties in the <see cref="ServiceBusMessage"/>.
413422
/// </summary>

sdk/servicebus/Azure.Messaging.ServiceBus/tests/Message/MessageTests.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Linq;
77
using System.Text;
88
using Azure.Core;
9+
using Azure.Core.Amqp;
910
using NUnit.Framework;
1011

1112
namespace Azure.Messaging.ServiceBus.Tests.Message
@@ -264,5 +265,47 @@ public void CreateReceivedMessageViaFactory()
264265
Assert.AreEqual(7632, receivedMessage.EnqueuedSequenceNumber);
265266
Assert.AreEqual(new DateTimeOffset(fixedDate, TimeSpan.FromSeconds(120)).UtcDateTime, receivedMessage.EnqueuedTime.UtcDateTime);
266267
}
268+
269+
[Test]
270+
[TestCase(true)]
271+
[TestCase(false)]
272+
public void CanSerializeDeserializeAmqpBytes(bool useSession)
273+
{
274+
var message = new ServiceBusMessage(new BinaryData(ServiceBusTestUtilities.GetRandomBuffer(100)));
275+
message.ContentType = "contenttype";
276+
message.CorrelationId = "correlationid";
277+
message.Subject = "label";
278+
message.MessageId = "messageId";
279+
message.PartitionKey = "key";
280+
message.ApplicationProperties.Add("testProp", "my prop");
281+
message.ReplyTo = "replyto";
282+
283+
message.ScheduledEnqueueTime = DateTimeOffset.Now;
284+
if (useSession)
285+
{
286+
message.SessionId = "key";
287+
message.ReplyToSessionId = "replytosession";
288+
}
289+
290+
message.TimeToLive = TimeSpan.FromSeconds(60);
291+
message.To = "to";
292+
293+
var serialized = message.GetRawAmqpMessage().ToBytes();
294+
295+
var deserialized = new ServiceBusMessage(AmqpAnnotatedMessage.FromBytes(serialized));
296+
Assert.AreEqual(message.ContentType, deserialized.ContentType);
297+
Assert.AreEqual(message.CorrelationId, deserialized.CorrelationId);
298+
Assert.AreEqual(message.Subject, deserialized.Subject);
299+
Assert.AreEqual(message.MessageId, deserialized.MessageId);
300+
Assert.AreEqual(message.PartitionKey, deserialized.PartitionKey);
301+
Assert.AreEqual(message.ApplicationProperties["testProp"], deserialized.ApplicationProperties["testProp"]);
302+
Assert.AreEqual(message.ReplyTo, deserialized.ReplyTo);
303+
Assert.AreEqual(message.ReplyToSessionId, deserialized.ReplyToSessionId);
304+
// because AMQP only has millisecond resolution, allow for up to a 1ms difference when round-tripping
305+
Assert.That(deserialized.ScheduledEnqueueTime, Is.EqualTo(message.ScheduledEnqueueTime).Within(1).Milliseconds);
306+
Assert.AreEqual(message.SessionId, deserialized.SessionId);
307+
Assert.AreEqual(message.TimeToLive, deserialized.TimeToLive);
308+
Assert.AreEqual(message.To, deserialized.To);
309+
}
267310
}
268311
}

0 commit comments

Comments
 (0)