in src/NMS.AMQP/NmsSession.cs [639:711]
public Task SendAsync(NmsMessageProducer producer, IDestination destination, IMessage original, MsgDeliveryMode deliveryMode,
MsgPriority priority, TimeSpan timeToLive, bool disableMessageId, bool disableMessageTimestamp, TimeSpan deliveryDelay)
{
if (destination == null)
throw new InvalidDestinationException("Destination must not be null");
if (original == null)
throw new MessageFormatException("Message must not be null");
NmsMessage outbound = null;
original.NMSDeliveryMode = deliveryMode;
original.NMSPriority = priority;
original.NMSRedelivered = false;
original.NMSDestination = destination;
bool isNmsMessage = original is NmsMessage;
DateTime timeStamp = DateTime.UtcNow;
bool hasTTL = timeToLive > TimeSpan.Zero;
bool hasDelay = deliveryDelay > TimeSpan.Zero;
if (!disableMessageTimestamp)
{
original.NMSTimestamp = timeStamp;
}
else
original.NMSTimestamp = DateTime.MinValue;
long messageSequence = producer.GetNextMessageSequence();
object messageId = null;
if (!disableMessageId)
{
messageId = producer.MessageIdBuilder.CreateMessageId(producer.ProducerId.ToString(), messageSequence);
}
if (isNmsMessage)
outbound = (NmsMessage) original;
else
outbound = NmsMessageTransformation.TransformMessage(Connection.MessageFactory, original);
// Set the message ID
outbound.Facade.ProviderMessageIdObject = messageId;
if (!isNmsMessage)
{
// If the original was a foreign message, we still need to update it
// with the properly encoded Message ID String, get it from the one
// we transformed from now that it is set.
original.NMSMessageId = outbound.NMSMessageId;
}
if (hasDelay)
{
outbound.Facade.DeliveryTime = timeStamp + deliveryDelay;
}
if (hasTTL)
outbound.Facade.Expiration = timeStamp + timeToLive;
else
outbound.Facade.Expiration = null;
outbound.OnSend(timeToLive);
bool fireAndForget = deliveryMode == MsgDeliveryMode.NonPersistent;
return TransactionContext.Send(new OutboundMessageDispatch
{
Message = outbound,
ProducerId = producer.Info.Id,
ProducerInfo = producer.Info,
FireAndForget = fireAndForget
});
}