Пример #1
0
        /// <summary>
        /// The resolve for.
        /// </summary>
        /// <param name="configuration">
        /// The configuration.
        /// </param>
        /// <returns>
        /// The <see cref="Listener"/>.
        /// </returns>
        public Listener ResolveFor(IReceiverConfiguration configuration)
        {
            using (RabbitChannel channel = this.bus.OpenChannel())
            {
                var topologyBuilder = new TopologyBuilder(channel);
                var builder         = new SubscriptionEndpointBuilder(this.bus.Endpoint, topologyBuilder, configuration);

                Maybe <Func <ISubscriptionEndpointBuilder, ISubscriptionEndpoint> > endpointBuilder = configuration.Options.GetEndpointBuilder();

                Assumes.True(endpointBuilder != null, "EndpointBuilder is null for [{0}].", configuration.Label);

                ISubscriptionEndpoint endpoint = endpointBuilder.Value(builder);

                lock (this.listeners)
                {
                    Listener listener = this.listeners.FirstOrDefault(l => l.Endpoint.ListeningSource.Equals(endpoint.ListeningSource));
                    if (listener == null)
                    {
                        listener = new Listener(this.bus, endpoint, (RabbitReceiverOptions)configuration.Options, this.bus.Configuration.ValidatorRegistry);
                        this.listeners.Add(listener);
                    }
                    else
                    {
                        EnsureConfigurationIsCompatible(listener, configuration);
                    }

                    return(listener);
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Инициализирует новый экземпляр класса <see cref="RabbitDelivery"/>.
        /// </summary>
        /// <param name="channel">Канал поставки сообщения.</param>
        /// <param name="args">Параметры поставки сообщения.</param>
        /// <param name="requiresAccept">Верно, если требуется подтверждение доставки.</param>
        public RabbitDelivery(RabbitChannel channel, BasicDeliverEventArgs args, bool requiresAccept)
        {
            this.Channel        = channel;
            this.Label          = channel.Bus.MessageLabelHandler.Resolve(args);
            this.Args           = args;
            this.requiresAccept = requiresAccept;

            this.headers = new Lazy <IDictionary <string, object> >(
                () => this.ExtractHeadersFrom(args));
        }
Пример #3
0
        /// <summary>
        /// The open channel.
        /// </summary>
        /// <returns>
        /// The <see cref="RabbitChannel"/>.
        /// </returns>
        /// <exception cref="InvalidOperationException">
        /// </exception>
        public virtual RabbitChannel OpenChannel()
        {
            if (this.Connection == null || !this.Connection.IsOpen)
            {
                throw new InvalidOperationException("RabbitMQ Connection is not open.");
            }

            try
            {
                var channel = new RabbitChannel(this, this.Connection.CreateModel());
                channel.Failed += (ch, args) => this.HandleBusFailure(args.GetException());
                return(channel);
            }
            catch (Exception ex)
            {
                this.HandleBusFailure(ex);
                throw;
            }
        }
Пример #4
0
        /// <summary>
        /// The resolve for.
        /// </summary>
        /// <param name="configuration">
        /// The configuration.
        /// </param>
        /// <returns>
        /// The <see cref="Producer"/>.
        /// </returns>
        public Producer ResolveFor(ISenderConfiguration configuration)
        {
            Producer producer = this.TryResolverFor(configuration.Label);

            if (producer == null)
            {
                using (RabbitChannel channel = this._bus.OpenChannel())
                {
                    var topologyBuilder = new TopologyBuilder(channel);
                    var builder         = new RouteResolverBuilder(this._bus.Endpoint, topologyBuilder, configuration);
                    Maybe <Func <IRouteResolverBuilder, IRouteResolver> > routeResolverBuilder = configuration.Options.GetRouteResolverBuilder();

                    Assumes.True(routeResolverBuilder.HasValue, "RouteResolverBuilder must be set for [{0}]", configuration.Label);

                    IRouteResolver routeResolver = routeResolverBuilder.Value(builder);

                    producer         = new Producer(this._bus, configuration.Label, routeResolver, configuration.Options.IsConfirmationRequired());
                    producer.Failed += p =>
                    {
                        {
                            // lock (_producers)
                            p.Dispose();
                            this._producers.Remove(p.Label);
                        }
                    };

                    // lock (_producers)
                    this._producers.Add(configuration.Label, producer);
                }

                if (configuration.RequiresCallback)
                {
                    producer.UseCallbackListener(this._bus.ListenerRegistry.ResolveFor(configuration.CallbackConfiguration));
                }
            }

            return(producer);
        }
Пример #5
0
 /// <summary>
 /// Инициализирует новый экземпляр класса <see cref="RabbitClient"/>.
 /// </summary>
 /// <param name="channel">
 /// The channel.
 /// </param>
 protected RabbitClient(RabbitChannel channel)
 {
     this.Channel = channel;
 }
Пример #6
0
 /// <summary>
 /// Инициализирует новый экземпляр класса <see cref="DefaultPublishConfirmationTracker"/>.
 /// </summary>
 /// <param name="channel">
 /// The channel.
 /// </param>
 public DefaultPublishConfirmationTracker(RabbitChannel channel)
 {
     this.channel = channel;
 }
Пример #7
0
 /// <summary>
 /// Создает входящее сообщение.
 /// </summary>
 /// <param name="channel">
 /// Канал, по которому получено сообщение.
 /// </param>
 /// <param name="args">
 /// Аргументы, с которыми получено сообщение.
 /// </param>
 /// <returns>
 /// Входящее сообщение.
 /// </returns>
 public RabbitDelivery BuildDeliveryFrom(RabbitChannel channel, BasicDeliverEventArgs args)
 {
     return(new RabbitDelivery(channel, args, this.ReceiverOptions.IsAcceptRequired()));
 }