public void Send(TransportMessage transportMessage, string destination)
{
var address = RabbitMqAddress.FromString(destination);
//if sending locally we need to munge some stuff (remove routing keys)
if (address == inputAddress)
{
address =
new RabbitMqAddress(
inputAddress.Broker,
inputAddress.VirtualHost,
inputAddress.Username,
inputAddress.Password,
inputAddress.Exchange,
inputAddress.QueueName,
string.Empty,
false);
}
using (var stream = new MemoryStream())
{
this.MessageSerializer.Serialize(transportMessage.Body, stream);
using (var channel = connectionProvider.Open(this.ProtocolName, address, true))
{
var messageId = Guid.NewGuid().ToString();
var properties = channel.CreateBasicProperties();
properties.MessageId = messageId;
if (!String.IsNullOrEmpty(transportMessage.CorrelationId))
{
properties.CorrelationId = transportMessage.CorrelationId;
}
properties.Timestamp = DateTime.UtcNow.ToAmqpTimestamp();
properties.ReplyTo = this.InputAddress;
properties.SetPersistent(transportMessage.Recoverable);
var headers = transportMessage.Headers;
if (headers != null && headers.Count > 0)
{
var dictionary = headers
.ToDictionary <HeaderInfo, string, object>
(entry => entry.Key, entry => entry.Value);
properties.Headers = dictionary;
}
if (address.RouteByType)
{
var type = transportMessage.Body[0].GetType();
string typeName = type.FullName;
log.InfoFormat("Sending message (routed) " + address.ToString(typeName) + " of " + type.Name);
channel.BasicPublish(address.Exchange, typeName, properties, stream.ToArray());
return;
}
var routingKeys = address.GetRoutingKeysAsArray();
if (routingKeys.Length > 1)
{
var message = "Too many Routing Keys specified for endpoint: " + address.ToString();
message += Environment.NewLine + "Keys: " + address.RoutingKeys;
log.Error(message);
throw new InvalidOperationException(message);
}
if (routingKeys.Length > 0)
{
var type = transportMessage.Body[0].GetType();
log.InfoFormat("Sending message (routed) " + address.ToString() + " of " + type.Name);
channel.BasicPublish(address.Exchange, routingKeys[0], properties, stream.ToArray());
return;
}
log.Info("Sending message " + address.ToString() + " of " + transportMessage.Body[0].GetType().Name);
channel.BasicPublish(address.Exchange, address.QueueName, properties, stream.ToArray());
transportMessage.Id = properties.MessageId;
}
}
}