public Uri GetDestinationAddress(string exchangeName, Action <IExchangeConfigurator> configure = null)
        {
            var sendSettings = new RabbitMqSendSettings(exchangeName, _exchangeTypeSelector.DefaultExchangeType, true, false);

            configure?.Invoke(sendSettings);

            return(sendSettings.GetSendAddress(_hostAddress));
        }
Example #2
0
        public Uri GetSendAddress(string exchangeName, Action <IExchangeConfigurator> configure = null)
        {
            var sendSettings = new RabbitMqSendSettings(exchangeName, ExchangeType.Fanout, true, false);

            configure?.Invoke(sendSettings);

            return(sendSettings.GetSendAddress(_settings.HostAddress));
        }
        Uri GetQueueAddress(QueueConfigurator configurator, Uri hostAddress, string suffix)
        {
            var queueName    = configurator.QueueName + suffix;
            var sendSettings = new RabbitMqSendSettings(queueName, ExchangeTypeSelector.DefaultExchangeType, configurator.Durable, configurator.AutoDelete);

            sendSettings.BindToQueue(queueName);

            return(sendSettings.GetSendAddress(hostAddress));
        }
Example #4
0
        public SendSettings GetSendSettings(Uri address)
        {
            var name = address.AbsolutePath.Substring(1);

            string[] pathSegments = name.Split('/');
            if (pathSegments.Length == 2)
            {
                name = pathSegments[1];
            }

            if (name == "*")
            {
                throw new ArgumentException("Cannot send to a dynamic address");
            }

            EntityNameValidator.ThrowIfInvalidEntityName(name);

            var isTemporary = address.Query.GetValueFromQueryString("temporary", false);

            var durable    = address.Query.GetValueFromQueryString("durable", !isTemporary);
            var autoDelete = address.Query.GetValueFromQueryString("autodelete", isTemporary);

            var exchangeType = address.Query.GetValueFromQueryString("type") ?? ExchangeTypeSelector.DefaultExchangeType;

            var settings = new RabbitMqSendSettings(name, exchangeType, durable, autoDelete);

            var bindToQueue = address.Query.GetValueFromQueryString("bind", false);

            if (bindToQueue)
            {
                var queueName = WebUtility.UrlDecode(address.Query.GetValueFromQueryString("queue"));
                settings.BindToQueue(queueName);
            }

            var delayedType = address.Query.GetValueFromQueryString("delayedType");

            if (!string.IsNullOrWhiteSpace(delayedType))
            {
                settings.SetExchangeArgument("x-delayed-type", delayedType);
            }

            var bindExchange = address.Query.GetValueFromQueryString("bindexchange");

            if (!string.IsNullOrWhiteSpace(bindExchange))
            {
                settings.BindToExchange(bindExchange);
            }

            var alternateExchange = address.Query.GetValueFromQueryString("alternateexchange");

            if (!string.IsNullOrWhiteSpace(alternateExchange))
            {
                settings.SetExchangeArgument("alternate-exchange", alternateExchange);
            }

            return(settings);
        }
Example #5
0
        /// <summary>
        /// Return the send settings for the address
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        public static SendSettings GetSendSettings(this Uri address)
        {
            if (string.Compare("rabbitmq", address.Scheme, StringComparison.OrdinalIgnoreCase) != 0)
            {
                throw new RabbitMqAddressException("The invalid scheme was specified: " + address.Scheme);
            }

            string name = address.AbsolutePath.Substring(1);

            string[] pathSegments = name.Split('/');
            if (pathSegments.Length == 2)
            {
                name = pathSegments[1];
            }


            if (name == "*")
            {
                throw new ArgumentException("Cannot send to a dynamic address");
            }

            VerifyQueueOrExchangeNameIsLegal(name);

            bool isTemporary = address.Query.GetValueFromQueryString("temporary", false);

            bool durable    = address.Query.GetValueFromQueryString("durable", !isTemporary);
            bool autoDelete = address.Query.GetValueFromQueryString("autodelete", isTemporary);

            string exchangeType = address.Query.GetValueFromQueryString("type") ?? ExchangeType.Fanout;

            var settings = new RabbitMqSendSettings(name, exchangeType, durable, autoDelete);

            bool bindToQueue = address.Query.GetValueFromQueryString("bind", false);

            if (bindToQueue)
            {
                string queueName = WebUtility.UrlDecode(address.Query.GetValueFromQueryString("queue"));
                settings.BindToQueue(queueName);
            }

            string delayedType = address.Query.GetValueFromQueryString("delayedType");

            if (!string.IsNullOrWhiteSpace(delayedType))
            {
                settings.SetExchangeArgument("x-delayed-type", delayedType);
            }

            string bindExchange = address.Query.GetValueFromQueryString("bindexchange");

            if (!string.IsNullOrWhiteSpace(bindExchange))
            {
                settings.BindToExchange(bindExchange);
            }

            return(settings);
        }
        protected override Uri GetErrorAddress()
        {
            string errorQueueName = _settings.QueueName + "_error";
            var    sendSettings   = new RabbitMqSendSettings(errorQueueName, RabbitMQ.Client.ExchangeType.Fanout, true,
                                                             false);

            sendSettings.BindToQueue(errorQueueName);

            return(_host.Settings.GetSendAddress(sendSettings));
        }
        protected override Uri GetErrorAddress()
        {
            var errorQueueName = _settings.QueueName + "_error";
            var sendSettings   = new RabbitMqSendSettings(errorQueueName, RabbitMQ.Client.ExchangeType.Fanout, _settings.Durable,
                                                          _settings.AutoDelete);

            sendSettings.BindToQueue(errorQueueName);

            return(sendSettings.GetSendAddress(_host.Settings.HostAddress));
        }
        protected override Uri GetDeadLetterAddress()
        {
            string errorQueueName = _settings.QueueName + "_skipped";
            var    sendSettings   = new RabbitMqSendSettings(errorQueueName, RabbitMQ.Client.ExchangeType.Fanout, _settings.Durable,
                                                             _settings.AutoDelete);

            sendSettings.BindToQueue(errorQueueName);

            return(_host.Settings.GetSendAddress(sendSettings));
        }
Example #9
0
        public Uri GetDestinationAddress(string exchangeName, Action <IExchangeConfigurator> configure = null)
        {
            var address = new RabbitMqEndpointAddress(_hostAddress, new Uri($"exchange:{exchangeName}"));

            var sendSettings = new RabbitMqSendSettings(address);

            configure?.Invoke(sendSettings);

            return(sendSettings.GetSendAddress(_hostAddress));
        }
Example #10
0
        public Uri GetDelayedExchangeDestinationAddress(Uri address)
        {
            var endpointAddress = new RabbitMqEndpointAddress(_hostAddress, address);

            var delayedExchangeAddress = endpointAddress.GetDelayAddress();

            var settings = new RabbitMqSendSettings(delayedExchangeAddress);

            settings.BindToExchange(endpointAddress.Name);

            return(settings.GetSendAddress(_hostAddress));
        }
Example #11
0
        public Uri GetDestinationAddress(Type messageType, Action <IExchangeConfigurator> configure = null)
        {
            var exchangeName = _messageNameFormatter.GetMessageName(messageType).ToString();
            var isTemporary  = TypeMetadataCache.IsTemporaryMessageType(messageType);
            var address      = new RabbitMqEndpointAddress(_hostAddress, new Uri($"exchange:{exchangeName}?temporary={isTemporary}"));

            var settings = new RabbitMqSendSettings(address);

            configure?.Invoke(settings);

            return(settings.GetSendAddress(_hostAddress));
        }
Example #12
0
        /// <summary>
        /// Return a send address for the exchange
        /// </summary>
        /// <param name="host">The RabbitMQ host</param>
        /// <param name="exchangeName">The exchange name</param>
        /// <param name="configure">An optional configuration for the exchange to set type, durable, etc.</param>
        /// <returns></returns>
        public static Uri GetSendAddress(this IRabbitMqHost host, string exchangeName, Action <IExchangeConfigurator> configure = null)
        {
            var builder = GetHostUriBuilder(host.Settings, exchangeName);

            var sendSettings = new RabbitMqSendSettings(exchangeName, ExchangeType.Fanout, true, false);

            configure?.Invoke(sendSettings);

            builder.Query += string.Join("&", GetQueryStringOptions(sendSettings));

            return(builder.Uri);
        }
        Uri GetDelayExchangeAddress(ReceiveSettings receiveSettings)
        {
            string delayExchangeName = receiveSettings.QueueName + "_delay";
            var    sendSettings      = new RabbitMqSendSettings(delayExchangeName, "x-delayed-message", receiveSettings.Durable, receiveSettings.AutoDelete);

            sendSettings.SetExchangeArgument("x-delayed-type", receiveSettings.ExchangeType);

            sendSettings.BindToQueue(receiveSettings.QueueName);

            var modelContext = _context.ReceiveContext.GetPayload <ModelContext>();

            return(modelContext.ConnectionContext.HostSettings.GetSendAddress(sendSettings));
        }
        public static SendSettings GetSendSettings(this IRabbitMqHost host, Type messageType, IMessageNameFormatter messageNameFormatter)
        {
            bool isTemporary = messageType.IsTemporaryMessageType();

            bool durable    = !isTemporary;
            bool autoDelete = isTemporary;

            string name = messageNameFormatter.GetMessageName(messageType).ToString();

            SendSettings settings = new RabbitMqSendSettings(name, ExchangeType.Fanout, durable, autoDelete);

            return(settings);
        }
Example #15
0
        Task <ISendEndpoint> GetSchedulerEndpoint(Uri destinationAddress)
        {
            var destinationSettings = _topology.GetSendSettings(destinationAddress);

            var sendSettings = new RabbitMqSendSettings(destinationSettings.ExchangeName + "_delay", "x-delayed-message", destinationSettings.Durable,
                                                        destinationSettings.AutoDelete);

            sendSettings.SetExchangeArgument("x-delayed-type", destinationSettings.ExchangeType);

            sendSettings.BindToExchange(destinationSettings.ExchangeName);

            var delayExchangeAddress = sendSettings.GetSendAddress(_hostAddress);

            return(_sendEndpointProvider.GetSendEndpoint(delayExchangeAddress));
        }
        public Uri GetDestinationAddress(Type messageType, Action <IExchangeConfigurator> configure = null)
        {
            var isTemporary = TypeMetadataCache.IsTemporaryMessageType(messageType);

            var durable    = !isTemporary;
            var autoDelete = isTemporary;

            var name = _messageNameFormatter.GetMessageName(messageType).ToString();

            var settings = new RabbitMqSendSettings(name, _exchangeTypeSelector.DefaultExchangeType, durable, autoDelete);

            configure?.Invoke(settings);

            return(settings.GetSendAddress(_hostAddress));
        }
        async Task MessageRedeliveryContext.ScheduleRedelivery(TimeSpan delay)
        {
            var receiveSettings = _context.ReceiveContext.GetPayload <ReceiveSettings>();

            string delayExchangeName = receiveSettings.QueueName + "_delay";
            var    sendSettings      = new RabbitMqSendSettings(delayExchangeName, "x-delayed-message", receiveSettings.Durable, receiveSettings.AutoDelete);

            sendSettings.SetExchangeArgument("x-delayed-type", receiveSettings.ExchangeType);

            sendSettings.BindToQueue(receiveSettings.QueueName);

            var modelContext = _context.ReceiveContext.GetPayload <ModelContext>();

            Uri delayExchangeAddress = modelContext.ConnectionContext.HostSettings.GetSendAddress(sendSettings);

            ISendEndpoint delayEndpoint = await _context.GetSendEndpoint(delayExchangeAddress);

            await delayEndpoint.Send(_context.Message, _context.CreateCopyContextPipe((x, y) => UpdateDeliveryContext(x, y, delay)));
        }
Example #18
0
        async Task <ScheduledMessage <T> > ScheduleSend <T>(Uri destinationAddress, DateTime scheduledTime, T message, IPipe <SendContext <T> > pipe, CancellationToken cancellationToken)
            where T : class
        {
            var destinationSettings = _topology.GetSendSettings(destinationAddress);

            var sendSettings = new RabbitMqSendSettings(destinationSettings.ExchangeName + "_delay", "x-delayed-message", destinationSettings.Durable,
                                                        destinationSettings.AutoDelete);

            sendSettings.SetExchangeArgument("x-delayed-type", destinationSettings.ExchangeType);

            sendSettings.BindToExchange(destinationSettings.ExchangeName);

            var delayExchangeAddress = sendSettings.GetSendAddress(_hostAddress);

            var delayEndpoint = await _sendEndpointProvider.GetSendEndpoint(delayExchangeAddress).ConfigureAwait(false);

            var messageId = NewId.NextGuid();

            IPipe <SendContext <T> > delayPipe = Pipe.ExecuteAsync <SendContext <T> >(async context =>
            {
                context.MessageId     = messageId;
                var rabbitSendContext = context.GetPayload <RabbitMqSendContext>();

                var delay = Math.Max(0,
                                     (scheduledTime.Kind == DateTimeKind.Local ? (scheduledTime - DateTime.Now) : (scheduledTime - DateTime.UtcNow)).TotalMilliseconds);

                if (delay > 0)
                {
                    rabbitSendContext.SetTransportHeader("x-delay", (long)delay);
                }

                await pipe.Send(context).ConfigureAwait(false);
            });

            await delayEndpoint.Send(message, delayPipe, cancellationToken).ConfigureAwait(false);

            return(new ScheduledMessageHandle <T>(messageId, scheduledTime, destinationAddress, message));
        }
        public static SendSettings GetSendSettings(this IRabbitMqHost host, Type messageType, IMessageNameFormatter messageNameFormatter)
        {
            bool isTemporary = messageType.IsTemporaryMessageType();

            bool durable = !isTemporary;
            bool autoDelete = isTemporary;

            string name = messageNameFormatter.GetMessageName(messageType).ToString();

            SendSettings settings = new RabbitMqSendSettings(name, ExchangeType.Fanout, durable, autoDelete);

            return settings;
        }
        protected override Uri GetErrorAddress()
        {
            string errorQueueName = _settings.QueueName + "_error";
            var sendSettings = new RabbitMqSendSettings(errorQueueName, RabbitMQ.Client.ExchangeType.Fanout, true,
                false);

            sendSettings.BindToQueue(errorQueueName);

            return _host.Settings.GetSendAddress(sendSettings);
        }
        /// <summary>
        /// Return a send address for the exchange
        /// </summary>
        /// <param name="host">The RabbitMQ host</param>
        /// <param name="exchangeName">The exchange name</param>
        /// <param name="configure">An optional configuration for the exchange to set type, durable, etc.</param>
        /// <returns></returns>
        public static Uri GetSendAddress(this IRabbitMqHost host, string exchangeName, Action<IExchangeConfigurator> configure = null)
        {
            var builder = GetHostUriBuilder(host.Settings, exchangeName);

            var sendSettings = new RabbitMqSendSettings(exchangeName, ExchangeType.Fanout, true, false);

            configure?.Invoke(sendSettings);

            builder.Query += string.Join("&", GetQueryStringOptions(sendSettings));

            return builder.Uri;
        }
Example #22
0
        private void OrderSend <T>(T message, CancellationToken cancelSend, Uri destination = null)
            where T : class
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            var factory = new ConnectionFactory
            {
                HostName = Configurations.Configuration.Instance.Setting.TransportIp.Split(',')[0],
                UserName = Configurations.Configuration.Instance.Setting.TransportUserName,
                Password = Configurations.Configuration.Instance.Setting.TransportPassword,
            };

            if (!string.IsNullOrEmpty(Configurations.Configuration.Instance.Setting.TransportVirtualHost))
            {
                factory.VirtualHost = Configurations.Configuration.Instance.Setting.TransportVirtualHost;
            }
            factory.AutomaticRecoveryEnabled = true;
            using (var connection = factory.CreateConnection(Configurations.Configuration.Instance.Setting.TransportIp.Split(',')))
            {
                using (var channel = connection.CreateModel())
                {
                    var properties = channel.CreateBasicProperties();
                    var setting    =
                        new RabbitMqSendSettings(
                            destination == null ? (typeof(T).Namespace + ":" + typeof(T).Name) : destination.AbsolutePath.Replace("/", ""),
                            "", true, false);
                    var exchange = Configurations.Configuration.Instance.Setting.TransportExchange;
                    var context  = new BasicPublishRabbitMqSendContext <T>(properties, exchange, message, cancelSend);
                    properties.ContentType = "application/vnd.masstransit+json";

                    try
                    {
                        var headers = context.Headers.GetAll()
                                      .Where(x => (x.Value != null) && (x.Value is string || x.Value.GetType().IsValueType))
                                      .ToArray();

                        if (properties.Headers == null)
                        {
                            properties.Headers = new Dictionary <string, object>(headers.Length);
                        }

                        foreach (var header in headers)
                        {
                            if (properties.Headers.ContainsKey(header.Key))
                            {
                                continue;
                            }

                            properties.SetHeader(header.Key, header.Value);
                        }
                        properties.Headers["Content-Type"] = "application/vnd.masstransit+json";
                        properties.Persistent = context.Durable;

                        if (context.MessageId.HasValue)
                        {
                            properties.MessageId = context.MessageId.ToString();
                        }

                        if (context.CorrelationId.HasValue)
                        {
                            properties.CorrelationId = context.CorrelationId.ToString();
                        }

                        if (context.TimeToLive.HasValue)
                        {
                            properties.Expiration = context.TimeToLive.Value.TotalMilliseconds.ToString("F0",
                                                                                                        CultureInfo.InvariantCulture);
                        }
                        channel.BasicPublish(context.Exchange, context.RoutingKey, context.Mandatory,
                                             context.BasicProperties, context.Body);
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }
        }
        /// <summary>
        /// Return the send settings for the address
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        public static SendSettings GetSendSettings(this Uri address)
        {
            if (string.Compare("rabbitmq", address.Scheme, StringComparison.OrdinalIgnoreCase) != 0)
                throw new RabbitMqAddressException("The invalid scheme was specified: " + address.Scheme);

            string name = address.AbsolutePath.Substring(1);
            string[] pathSegments = name.Split('/');
            if (pathSegments.Length == 2)
                name = pathSegments[1];


            if (name == "*")
                throw new ArgumentException("Cannot send to a dynamic address");

            VerifyQueueOrExchangeNameIsLegal(name);

            bool isTemporary = address.Query.GetValueFromQueryString("temporary", false);

            bool durable = address.Query.GetValueFromQueryString("durable", !isTemporary);
            bool autoDelete = address.Query.GetValueFromQueryString("autodelete", isTemporary);

            string exchangeType = address.Query.GetValueFromQueryString("type") ?? ExchangeType.Fanout;

            var settings = new RabbitMqSendSettings(name, exchangeType, durable, autoDelete);

            bool bindToQueue = address.Query.GetValueFromQueryString("bind", false);
            if (bindToQueue)
            {
                string queueName = WebUtility.UrlDecode(address.Query.GetValueFromQueryString("queue"));
                settings.BindToQueue(queueName);
            }

            string delayedType = address.Query.GetValueFromQueryString("delayedType");
            if (!string.IsNullOrWhiteSpace(delayedType))
                settings.SetExchangeArgument("x-delayed-type", delayedType);

            string bindExchange = address.Query.GetValueFromQueryString("bindexchange");
            if (!string.IsNullOrWhiteSpace(bindExchange))
                settings.BindToExchange(bindExchange);

            return settings;
        }
        protected override Uri GetDeadLetterAddress()
        {
            string errorQueueName = _settings.QueueName + "_skipped";
            var sendSettings = new RabbitMqSendSettings(errorQueueName, RabbitMQ.Client.ExchangeType.Fanout, _settings.Durable,
                _settings.AutoDelete);

            sendSettings.BindToQueue(errorQueueName);

            return _host.Settings.GetSendAddress(sendSettings);
        }