in src/main/csharp/MessageProducer.cs [111:211]
public void Send(IDestination destination, IMessage message, MsgDeliveryMode deliveryMode, MsgPriority priority, TimeSpan timeToLive)
{
MessageQueue mq = null;
try
{
// Locate the MSMQ Queue we will be sending to
if(messageQueue != null)
{
if(destination == null)
{
throw new InvalidDestinationException("This producer can only be used to send to: " + destination);
}
if(destination.Equals(this.destination))
{
mq = messageQueue;
}
else
{
throw new NotSupportedException("This producer can only be used to send to: " + destination);
}
}
else
{
if(destination == null)
{
throw new NotSupportedException();
}
mq = OpenMessageQueue((Destination) destination);
}
if(this.ProducerTransformer != null)
{
IMessage transformed = this.ProducerTransformer(this.session, this, message);
if(transformed != null)
{
message = transformed;
}
}
message.NMSDeliveryMode = deliveryMode;
message.NMSTimeToLive = timeToLive;
message.NMSPriority = priority;
if(!DisableMessageTimestamp)
{
message.NMSTimestamp = DateTime.UtcNow;
}
if(!DisableMessageID)
{
// TODO: message.NMSMessageId =
}
// Convert the Message into a MSMQ message
Message msg = session.MessageConverter.ToMsmqMessage(message);
if(mq.Transactional)
{
if(session.Transacted)
{
mq.Send(msg, session.MessageQueueTransaction);
}
else
{
// Start our own mini transaction here to send the message.
using(MessageQueueTransaction transaction = new MessageQueueTransaction())
{
transaction.Begin();
mq.Send(msg, transaction);
transaction.Commit();
}
}
}
else
{
if(session.Transacted)
{
// We may want to raise an exception here since app requested
// a transeced NMS session, but is using a non transacted message queue
// For now silently ignore it.
}
mq.Send(msg);
}
message.NMSMessageId = msg.Id;
if(message.NMSCorrelationID == null)
{
message.NMSCorrelationID = msg.CorrelationId;
}
}
finally
{
if(mq != null && mq != messageQueue)
{
mq.Dispose();
}
}
}