in src/main/csharp/MessageProducer.cs [103:197]
public void Send(IDestination dest, IMessage message, MsgDeliveryMode deliveryMode, MsgPriority priority, TimeSpan timeToLive, bool specifiedTimeToLive)
{
if(null == dest)
{
return;
}
if(null != this.ProducerTransformer)
{
IMessage transformedMessage = ProducerTransformer(this.session, this, message);
if(null != transformedMessage)
{
message = transformedMessage;
}
}
// Serialize the message data
Destination theDest = (Destination) dest;
List<byte> msgDataBuilder = new List<byte>();
// Always set the message Id.
message.NMSMessageId = Guid.NewGuid().ToString();
message.NMSTimestamp = DateTime.UtcNow;
if(specifiedTimeToLive)
{
message.NMSTimeToLive = timeToLive;
}
// Prefix the message with the destination name. The client will subscribe to this destination name
// in order to receive messages.
msgDataBuilder.AddRange(Encoding.UTF8.GetBytes(theDest.Name));
// Encode all meta data (e.g., headers and properties)
EncodeField(msgDataBuilder, WireFormat.MFT_MESSAGEID, message.NMSMessageId);
EncodeField(msgDataBuilder, WireFormat.MFT_TIMESTAMP, message.NMSTimestamp.ToBinary());
if(null != message.NMSType)
{
EncodeField(msgDataBuilder, WireFormat.MFT_NMSTYPE, message.NMSType);
}
if(null != message.NMSCorrelationID)
{
EncodeField(msgDataBuilder, WireFormat.MFT_CORRELATIONID, message.NMSCorrelationID);
}
if(null != message.NMSReplyTo)
{
EncodeField(msgDataBuilder, WireFormat.MFT_REPLYTO, ((Destination) message.NMSReplyTo).Name);
}
EncodeField(msgDataBuilder, WireFormat.MFT_DELIVERYMODE, message.NMSDeliveryMode);
EncodeField(msgDataBuilder, WireFormat.MFT_PRIORITY, message.NMSPriority);
EncodeField(msgDataBuilder, WireFormat.MFT_TIMETOLIVE, message.NMSTimeToLive.Ticks);
IPrimitiveMap properties = message.Properties;
if(null != properties && properties.Count > 0)
{
EncodeField(msgDataBuilder, WireFormat.MFT_HEADERS, ((PrimitiveMap) properties).Marshal());
}
if(message is ITextMessage)
{
EncodeField(msgDataBuilder, WireFormat.MFT_MSGTYPE, WireFormat.MT_TEXTMESSAGE);
// Append the message text body to the msg.
string msgBody = ((ITextMessage) message).Text;
if(null != msgBody)
{
EncodeField(msgDataBuilder, WireFormat.MFT_BODY, msgBody);
}
}
else if(message is IBytesMessage)
{
EncodeField(msgDataBuilder, WireFormat.MFT_MSGTYPE, WireFormat.MT_BYTESMESSAGE);
// Append the message text body to the msg.
byte[] msgBody = ((IBytesMessage) message).Content;
if(null != msgBody)
{
EncodeField(msgDataBuilder, WireFormat.MFT_BODY, msgBody);
}
}
else
{
// TODO: Add support for more message types
EncodeField(msgDataBuilder, WireFormat.MFT_MSGTYPE, WireFormat.MT_MESSAGE);
}
// Put the sentinal field marker.
EncodeField(msgDataBuilder, WireFormat.MFT_NONE, 0);
((BaseMessage) message).OnSend();
theDest.Send(msgDataBuilder.ToArray());
}