Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ public enum ServiceBusFailureReason
public partial class ServiceBusMessage
{
public ServiceBusMessage() { }
public ServiceBusMessage(Azure.Core.Amqp.AmqpAnnotatedMessage message) { }
public ServiceBusMessage(Azure.Messaging.ServiceBus.ServiceBusReceivedMessage receivedMessage) { }
public ServiceBusMessage(System.BinaryData body) { }
public ServiceBusMessage(System.ReadOnlyMemory<byte> body) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,15 @@ public ServiceBusMessage(ServiceBusReceivedMessage receivedMessage)
}
}

/// <summary>
/// Creates a new message from the specified <see cref="AmqpAnnotatedMessage"/> instance.
/// </summary>
/// <param name="message">The AMQP message.</param>
public ServiceBusMessage(AmqpAnnotatedMessage message)
{
AmqpMessage = message;
}

/// <summary>
/// Gets or sets the body of the message.
/// </summary>
Expand Down Expand Up @@ -411,7 +420,7 @@ public DateTimeOffset ScheduledEnqueueTime
internal AmqpAnnotatedMessage AmqpMessage { get; set; }

/// <summary>
/// Gets the raw Amqp message data that will be transmitted over the wire.
/// Gets the raw AMQP message data that will be transmitted over the wire.
/// This can be used to enable scenarios that require setting AMQP header, footer, property, or annotation
/// data that is not exposed as top level properties in the <see cref="ServiceBusMessage"/>.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Linq;
using System.Text;
using Azure.Core;
using Azure.Core.Amqp;
using NUnit.Framework;

namespace Azure.Messaging.ServiceBus.Tests.Message
Expand Down Expand Up @@ -264,5 +265,47 @@ public void CreateReceivedMessageViaFactory()
Assert.AreEqual(7632, receivedMessage.EnqueuedSequenceNumber);
Assert.AreEqual(new DateTimeOffset(fixedDate, TimeSpan.FromSeconds(120)).UtcDateTime, receivedMessage.EnqueuedTime.UtcDateTime);
}

[Test]
[TestCase(true)]
[TestCase(false)]
public void CanSerializeDeserializeAmqpBytes(bool useSession)
{
var message = new ServiceBusMessage(new BinaryData(ServiceBusTestUtilities.GetRandomBuffer(100)));
message.ContentType = "contenttype";
message.CorrelationId = "correlationid";
message.Subject = "label";
message.MessageId = "messageId";
message.PartitionKey = "key";
message.ApplicationProperties.Add("testProp", "my prop");
message.ReplyTo = "replyto";

message.ScheduledEnqueueTime = DateTimeOffset.Now;
if (useSession)
{
message.SessionId = "key";
message.ReplyToSessionId = "replytosession";
}

message.TimeToLive = TimeSpan.FromSeconds(60);
message.To = "to";

var serialized = message.GetRawAmqpMessage().ToBytes();

var deserialized = new ServiceBusMessage(AmqpAnnotatedMessage.FromBytes(serialized));
Assert.AreEqual(message.ContentType, deserialized.ContentType);
Assert.AreEqual(message.CorrelationId, deserialized.CorrelationId);
Assert.AreEqual(message.Subject, deserialized.Subject);
Assert.AreEqual(message.MessageId, deserialized.MessageId);
Assert.AreEqual(message.PartitionKey, deserialized.PartitionKey);
Assert.AreEqual(message.ApplicationProperties["testProp"], deserialized.ApplicationProperties["testProp"]);
Assert.AreEqual(message.ReplyTo, deserialized.ReplyTo);
Assert.AreEqual(message.ReplyToSessionId, deserialized.ReplyToSessionId);
// because AMQP only has millisecond resolution, allow for up to a 1ms difference when round-tripping
Assert.That(deserialized.ScheduledEnqueueTime, Is.EqualTo(message.ScheduledEnqueueTime).Within(1).Milliseconds);
Assert.AreEqual(message.SessionId, deserialized.SessionId);
Assert.AreEqual(message.TimeToLive, deserialized.TimeToLive);
Assert.AreEqual(message.To, deserialized.To);
}
}
}