public QueueDetails GetQueueDetails() { var loggingStringBuilder = new StringBuilder(); var restItems = FindRelationAndFollow("http://api.sportingsolutions.com/rels/stream/amqp", "GetAmqpStream HTTP error", loggingStringBuilder); if (restItems == null) { return(null); } var amqpLink = restItems.SelectMany(restItem => restItem.Links).First(restLink => restLink.Relation == "amqp"); var amqpUri = new Uri(amqpLink.Href); var queueDetails = new QueueDetails { Host = amqpUri.Host }; var userInfo = amqpUri.UserInfo; userInfo = HttpUtility.UrlDecode(userInfo); if (!String.IsNullOrEmpty(userInfo)) { var userPass = userInfo.Split(':'); if (userPass.Length > 2) { throw new ArgumentException(string.Format("Bad user info in AMQP URI: {0}", userInfo)); } queueDetails.UserName = userPass[0]; if (userPass.Length == 2) { queueDetails.Password = userPass[1]; } } var path = amqpUri.AbsolutePath; if (!String.IsNullOrEmpty(path)) { queueDetails.Name = path.Substring(path.IndexOf('/', 1) + 1); var virtualHost = path.Substring(1, path.IndexOf('/', 1) - 1); queueDetails.VirtualHost = virtualHost; _virtualHost = queueDetails.VirtualHost; } var port = amqpUri.Port; if (port != -1) { queueDetails.Port = port; } return(queueDetails); }
private void Connect(IConsumer consumer) { if (State != ConnectionState.CONNECTED) { // this prevents any other execution of EstablishConnection(). // EstablishConnection() wakes up any sleeping threads when it finishes lock (_connectionLock) { while (State == ConnectionState.CONNECTING) { // wait until the connection is established Monitor.Wait(_connectionLock); } if (State == ConnectionState.CONNECTED || _cancellationTokenSource.IsCancellationRequested) { return; } State = ConnectionState.CONNECTING; } // GetQueueDetails() returns the credentials for connecting to the AMQP server // but it also asks the server to create an AMQP queue for the caller. // As the time to establish a connection could take a while (just think about // a not reliable network), the created AMQP queue could expire before we // call BasicConsume() on it. // // To prevent this situation, we call GetQueueDetails() twice for the consumer // who establish the connection, one here, and the second time on // AddConsumeToQueue() QueueDetails queue = null; try { queue = consumer.GetQueueDetails(); if (queue == null || string.IsNullOrEmpty(queue.Name)) { throw new Exception("queue's name is not valid for consumerId=" + consumer.Id); } } catch (Exception e) { _logger.Error("Error acquiring queue details for consumerId=" + consumer.Id, e); OnConnectionStatusChanged(ConnectionState.DISCONNECTED); throw; } var factory = new ConnectionFactory { RequestedHeartbeat = UDAPI.Configuration.AMQPMissedHeartbeat, HostName = queue.Host, Port = queue.Port, UserName = queue.UserName, Password = queue.Password, VirtualHost = "/" + queue.VirtualHost // this is not used anymore, we keep it for retro-compatibility }; EstablishConnection(factory); } }
public QueueDetails GetQueueDetails() { var loggingStringBuilder = new StringBuilder(); var restItems = FindRelationAndFollow("http://api.sportingsolutions.com/rels/stream/amqp", "GetAmqpStream HTTP error", loggingStringBuilder); var amqpLink = restItems.SelectMany(restItem => restItem.Links).First(restLink => restLink.Relation == "amqp"); var amqpUri = new Uri(amqpLink.Href); var queueDetails = new QueueDetails { Host = amqpUri.Host }; var userInfo = amqpUri.UserInfo; userInfo = HttpUtility.UrlDecode(userInfo); if (!String.IsNullOrEmpty(userInfo)) { var userPass = userInfo.Split(':'); if (userPass.Length > 2) { throw new ArgumentException(string.Format("Bad user info in AMQP URI: {0}", userInfo)); } queueDetails.UserName = userPass[0]; if (userPass.Length == 2) { queueDetails.Password = userPass[1]; } } var path = amqpUri.AbsolutePath; if (!String.IsNullOrEmpty(path)) { queueDetails.Name = path.Substring(path.IndexOf('/', 1) + 1); var virtualHost = path.Substring(1, path.IndexOf('/', 1) - 1); queueDetails.VirtualHost = virtualHost; _virtualHost = queueDetails.VirtualHost; } var port = amqpUri.Port; if (port != -1) { queueDetails.Port = port; } return queueDetails; }