Пример #1
0
        void InitializeLogicalQueue(string queueName, IModel model, bool asErrorQueue, bool autoDelete = false)
        {
            log.Info("Initializing logical queue '{0}'", queueName);

            var arguments = new Dictionary <string, object> {
                { "x-ha-policy", "all" }
            };                                                                           //< enable queue mirroring

            log.Debug("Declaring queue '{0}'", queueName);
            model.QueueDeclare(queueName, durable: true,
                               arguments: arguments,
                               autoDelete: autoDelete,
                               exclusive: false);

            // Error queues do not need additional setup.
            // @mookid8000: for "Traditional" Rebus RabbitMQ usage, yes they do - otherwise, failed messages might be published using a topic to which there are no subscribers
            if (asErrorQueue && UsingOneExchangePerMessageTypeRouting)
            {
                return;
            }

            if (UsingOneExchangePerMessageTypeRouting)
            {
                log.Debug("Queue '{0}' is using one exchange-per-type routing.", queueName);

                if (InputQueueAddressIsExchange && ensureInputExchangeIsDeclared)
                {
                    var exchangeName = InputQueueAddress.TrimStart('@');

                    log.Debug("Declaring (input) exchange '{0}'", InputQueueAddress);
                    model.ExchangeDeclare(exchangeName, ExchangeType.Fanout, true);

                    log.Debug("Binding queue '{0}' to exchange '{0}'", InputQueue, exchangeName);
                    model.QueueBind(InputQueue, exchangeName, "");
                }

                return;
            }

            if (ensureExchangeIsDeclared)
            {
                log.Debug("Declaring exchange '{0}'", ExchangeName);
                model.ExchangeDeclare(ExchangeName, ExchangeType.Topic, true);
            }

            if (bindDefaultTopicToInputQueue)
            {
                log.Debug("Binding topic '{0}' to queue '{1}'", queueName, queueName);
                model.QueueBind(queueName, ExchangeName, queueName);
            }
        }
Пример #2
0
        void RemoveSubscription(IModel model, Type subscription)
        {
            var eventName    = GetEventName(subscription);
            var exchange     = UsingOneExchangePerMessageTypeRouting ? eventName : ExchangeName;
            var routingKey   = UsingOneExchangePerMessageTypeRouting ? "" : eventName;
            var inputAddress = InputQueueAddress.TrimStart('@');

            log.Info("Unsubscribing {0} from {1}", inputAddress, eventName);
            if (InputQueueAddressIsExchange)
            {
                model.ExchangeUnbind(inputAddress, exchange, routingKey);
            }
            else
            {
                model.QueueUnbind(inputAddress, exchange, routingKey, new Dictionary <string, object>());
            }
        }
Пример #3
0
        void EstablishSubscription(IModel model, Type subscription)
        {
            var eventName    = GetEventName(subscription);
            var exchange     = UsingOneExchangePerMessageTypeRouting ? eventName : ExchangeName;
            var routingKey   = UsingOneExchangePerMessageTypeRouting ? "" : eventName;
            var inputAddress = InputQueueAddress.TrimStart('@');

            if (UsingOneExchangePerMessageTypeRouting)
            {
                log.Debug("Declaring fanout exchange for: {0}", exchange);
                model.ExchangeDeclare(exchange, "fanout", true, false, null);
            }

            log.Info("Subscribing {0} to {1}", inputAddress, eventName);
            if (InputQueueAddressIsExchange)
            {
                model.ExchangeBind(inputAddress, exchange, routingKey);
            }
            else
            {
                model.QueueBind(inputAddress, exchange, routingKey);
            }
        }