Пример #1
0
        /// <summary>
        /// Returns current QoS settings
        /// </summary>
        /// <param name="builder"></param>
        /// <returns></returns>
        public static Maybe <QoSParams> GetQoS(this IReceiverConfigurator builder)
        {
            var config  = builder as ReceiverConfiguration;
            var options = config?.Options as RabbitReceiverOptions;

            return(options != null?options.GetQoS() : Maybe <QoSParams> .Empty);
        }
Пример #2
0
            /// <summary>
            /// »нициализирует новый экземпл¤р класса <see cref="given_producer_and_consumer_is_set"/>.
            /// </summary>
            /// <param name="acceptRequired">
            /// The accept required.
            /// </param>
            public given_producer_and_consumer_is_set(bool acceptRequired)
            {
                this.Producer = this.StartBus("producer", cfg => cfg.Route("boo"));

                this.Consumer = this.StartBus(
                    "consumer",
                    cfg =>
                {
                    IReceiverConfigurator <BooMessage> receiverConfiguration = cfg.On <BooMessage>("boo").
                                                                               ReactWith(
                        (m, ctx) =>
                    {
                        this.Result[m.Num] = true;
                        if (this.Result.All(r => r))
                        {
                            this.CompletionHandler.Set();
                        }

                        ctx.Accept();
                    });

                    if (acceptRequired)
                    {
                        receiverConfiguration.RequiresAccept();
                    }
                });
            }
Пример #3
0
        /// <summary>
        /// The with qo s.
        /// </summary>
        /// <param name="builder">
        /// The builder.
        /// </param>
        /// <param name="qosParams">
        /// The qos params.
        /// </param>
        /// <typeparam name="T">
        /// </typeparam>
        /// <returns>
        /// The <see cref="IReceiverConfigurator"/>.
        /// </returns>
        public static IReceiverConfigurator <T> WithQoS <T>(this IReceiverConfigurator <T> builder, QoSParams qosParams) where T : class
        {
            ReceiverConfiguration configuration = ((TypedReceiverConfigurationDecorator <T>)builder).Configuration;

            WithQoS(configuration, qosParams);

            return(builder);
        }
Пример #4
0
        /// <summary>
        /// Configures receiver to reuse a connection if possible.
        /// </summary>
        /// <param name="builder">
        /// The builder.
        /// </param>
        /// <param name="reuse">
        /// Connection reuse flag.
        /// </param>
        /// <typeparam name="T">
        /// </typeparam>
        /// <returns>
        /// The <see cref="IReceiverConfigurator"/>.
        /// </returns>
        public static IReceiverConfigurator <T> ReuseConnection <T>(this IReceiverConfigurator <T> builder, bool reuse = true) where T : class
        {
            var configuration = ((TypedReceiverConfigurationDecorator <T>)builder).Configuration;

            ReuseConnection(configuration, reuse);

            return(builder);
        }
Пример #5
0
        /// <summary>
        /// Configure receiver to use a connection string.
        /// </summary>
        /// <param name="builder">
        /// The builder.
        /// </param>
        /// <param name="connectionString">
        /// The connection string.
        /// </param>
        /// <typeparam name="T">
        /// </typeparam>
        /// <returns>
        /// The <see cref="IReceiverConfigurator"/>.
        /// </returns>
        public static IReceiverConfigurator <T> WithConnectionString <T>(this IReceiverConfigurator <T> builder,
                                                                         string connectionString) where T : class
        {
            var configuration = ((TypedReceiverConfigurationDecorator <T>)builder).Configuration;

            WithConnectionString(configuration, connectionString);

            return(builder);
        }
Пример #6
0
        /// <summary>
        /// Configures receiver to reuse a connection if possible
        /// </summary>
        /// <param name="builder">
        /// The builder.
        /// </param>
        /// <param name="reuse">
        /// The reuse.
        /// </param>
        /// <returns>
        /// The <see cref="IReceiverConfigurator"/>.
        /// </returns>
        public static IReceiverConfigurator ReuseConnection(this IReceiverConfigurator builder, bool reuse = true)
        {
            var configuration = builder as ReceiverConfiguration;
            var options       = configuration?.Options as RabbitReceiverOptions;

            if (options != null)
            {
                options.ReuseConnection = reuse;
            }

            return(builder);
        }
Пример #7
0
        /// <summary>
        /// Инициализирует новый экземпляр класса <see cref="SagaConfiguration{TS,TM,TK}"/>.
        /// </summary>
        /// <param name="receiverConfigurator">Конфигурация получателя входящего сообщения.</param>
        /// <param name="sagaRepository">Хранилище саги.</param>
        /// <param name="sagaIdSeparator">Вычислитель идентификатора саги.</param>
        /// <param name="sagaFactory">Фабрика саги.</param>
        /// <param name="sagaStep">Действие выполняемое при обработке саги.</param>
        /// <param name="sagaFailedHandler">Обработчик возникающих ошибок.</param>
        public SagaConfiguration(
            IReceiverConfigurator <TM> receiverConfigurator,
            ISagaRepository <TS, TK> sagaRepository,
            ISagaIdSeparator <TM, TK> sagaIdSeparator,
            ISagaFactory <TS, TK> sagaFactory,
            ISagaStep <TS, TM, TK> sagaStep,
            ISagaFailedHandler <TS, TM, TK> sagaFailedHandler)
        {
            this.receiverConfigurator = receiverConfigurator;

            this.sagaLifecycle = new DefaultSagaLifecycle <TS, TM, TK>(sagaRepository, sagaIdSeparator, sagaFactory);
            this.sagaConsumer  = new SagaConsumerOf <TS, TM, TK>(this.sagaLifecycle, sagaStep, false, sagaFailedHandler);
        }
Пример #8
0
        // TODO: make less fragile

        /// <summary>
        /// The register consumer.
        /// </summary>
        /// <param name="configurator">
        /// The configurator.
        /// </param>
        /// <param name="messageType">
        /// The message type.
        /// </param>
        /// <param name="consumer">
        /// The consumer.
        /// </param>
        private static void RegisterConsumer(IReceiverConfigurator configurator, Type messageType, object consumer)
        {
            Type configuratorType = configurator.GetType();

            MethodInfo method = configuratorType.GetMethods().
                                Single(
                mi =>     // mi.Name == "ReactWith" && //avoiding binding to method name
                mi.IsGenericMethod && mi.ContainsGenericParameters && mi.GetParameters()
                .Count() == 1 && mi.GetParameters()
                .First()
                .ParameterType.Name == typeof(IConsumerOf <>).Name);

            method.MakeGenericMethod(messageType)
            .Invoke(configurator, new[] { consumer });
        }
Пример #9
0
        /// <summary>
        /// Configure receiver to use a connection string.
        /// </summary>
        /// <param name="builder">
        /// The builder.
        /// </param>
        /// <param name="connectionString">
        /// The connection string.
        /// </param>
        /// <returns>
        /// The <see cref="IReceiverConfigurator"/>.
        /// </returns>
        public static IReceiverConfigurator WithConnectionString(this IReceiverConfigurator builder,
                                                                 string connectionString)
        {
            var receiverConfiguration = (ReceiverConfiguration)builder;
            var rabbitReceiverOptions = (RabbitReceiverOptions)receiverConfiguration.Options;

            // The connection string should not be overridden if the connection string provider is present and it does not return nulls
            var provider = rabbitReceiverOptions.GetConnectionStringProvider();

            if (!string.IsNullOrEmpty(provider?.GetConnectionString(receiverConfiguration.Label)))
            {
                return(builder);
            }

            rabbitReceiverOptions.ConnectionString = connectionString;
            return(builder);
        }
Пример #10
0
        /// <summary>
        /// Конфигурирует клиента шины сообщений.
        /// </summary>
        /// <param name="endpointName">
        /// Имя точки подключения к шине.
        /// </param>
        /// <param name="cfg">
        /// Конфигуратор клиента шины.
        /// </param>
        /// <returns>
        /// Конфигуратор клиента шины, после применения к нему всех настроек.
        /// </returns>
        public IBusConfigurator Configure(string endpointName, IBusConfigurator cfg)
        {
            if (cfg == null)
            {
                throw new ArgumentNullException("cfg", "Файл конфигурации не может быть null");
            }

            EndpointElement endpointConfig = this.GetEndPointByName(endpointName);

            cfg.SetEndpoint(endpointConfig.Name);

            cfg.SetConnectionString(endpointConfig.ConnectionString);

            if (!string.IsNullOrWhiteSpace(endpointConfig.LifecycleHandler))
            {
                cfg.HandleLifecycleWith(this.ResolveLifecycleHandler(endpointConfig.LifecycleHandler));
            }

            if (endpointConfig.Caching != null && endpointConfig.Caching.Enabled)
            {
                cfg.EnableCaching();
            }

            if (endpointConfig.ParallelismLevel.HasValue)
            {
                cfg.UseParallelismLevel(endpointConfig.ParallelismLevel.Value);
            }

            if (endpointConfig.Dynamic != null)
            {
                if (endpointConfig.Dynamic.Outgoing.HasValue)
                {
                    if (endpointConfig.Dynamic.Outgoing.Value)
                    {
                        cfg.Route(MessageLabel.Any)
                        .ConfiguredWith(builder => new LambdaRouteResolver(
                                            (endpoint, label) =>
                        {
                            builder.Topology.Declare(
                                Exchange.Named(label.Name)
                                .Durable.Fanout);
                            return(new RabbitRoute(label.Name));
                        }));
                    }
                }
            }

            if (endpointConfig.Qos != null)
            {
                if (endpointConfig.Qos.PrefetchCount.HasValue)
                {
                    cfg.SetDefaultQoS(endpointConfig.Qos.PrefetchCount.Value);
                }
            }

            foreach (ValidatorElement validator in endpointConfig.Validators)
            {
                if (validator.Group)
                {
                    MessageValidatorGroup v = this.ResolveValidatorGroup(validator.Name);
                    cfg.RegisterValidators(v);
                }
                else
                {
                    IMessageValidator v = this.ResolveValidator(validator.Name);
                    cfg.RegisterValidator(v);
                }
            }

            foreach (OutgoingElement message in endpointConfig.Outgoing)
            {
                ISenderConfigurator senderCfg = cfg.Route(message.Label).
                                                WithAlias(message.Key);

                if (message.Confirm)
                {
                    senderCfg.WithConfirmation();
                }

                if (message.Persist)
                {
                    senderCfg.Persistently();
                }

                if (message.Ttl.HasValue)
                {
                    senderCfg.WithTtl(message.Ttl.Value);
                }

                if (message.CallbackEndpoint.Default)
                {
                    senderCfg.WithDefaultCallbackEndpoint();
                }

                if (message.Timeout.HasValue)
                {
                    senderCfg.WithRequestTimeout(message.Timeout);
                }
            }

            foreach (IncomingElement message in endpointConfig.Incoming)
            {
                IReceiverConfigurator receiver = cfg.On(message.Label).
                                                 WithAlias(message.Key);

                if (message.RequiresAccept)
                {
                    receiver.RequiresAccept();
                }

                Type messageType = typeof(ExpandoObject);
                if (!string.IsNullOrWhiteSpace(message.Type))
                {
                    messageType = ResolveType(message.Type);
                }

                var consumerFactory = this.BuildConsumerFactory(message.React, messageType);

                object consumer = BuildConsumer(consumerFactory, messageType, message.Lifestyle);

                RegisterConsumer(receiver, messageType, consumer);

                if (!string.IsNullOrWhiteSpace(message.Validate))
                {
                    IMessageValidator validator = this.ResolveValidator(message.Validate, messageType);

                    receiver.WhenVerifiedBy(validator);
                }
            }

            return(cfg);
        }
Пример #11
0
 /// <summary>
 /// The with qo s.
 /// </summary>
 /// <param name="builder">
 /// The builder.
 /// </param>
 /// <param name="prefetchCount">
 /// The prefetch count.
 /// </param>
 /// <param name="prefetchSize">
 /// The prefetch size.
 /// </param>
 /// <typeparam name="T">
 /// </typeparam>
 /// <returns>
 /// The <see cref="IReceiverConfigurator"/>.
 /// </returns>
 public static IReceiverConfigurator <T> WithQoS <T>(this IReceiverConfigurator <T> builder, ushort prefetchCount, uint prefetchSize) where T : class
 {
     return(builder.WithQoS(new QoSParams(prefetchCount, prefetchSize)));
 }
Пример #12
0
        /// <summary>
        /// The with qo s.
        /// </summary>
        /// <param name="builder">
        /// The builder.
        /// </param>
        /// <param name="qosParams">
        /// The qos params.
        /// </param>
        /// <returns>
        /// The <see cref="IReceiverConfigurator"/>.
        /// </returns>
        public static IReceiverConfigurator WithQoS(this IReceiverConfigurator builder, QoSParams qosParams)
        {
            ((RabbitReceiverOptions)((ReceiverConfiguration)builder).Options).QoS = qosParams;

            return(builder);
        }
Пример #13
0
        // TODO: make less fragile
        /// <summary>
        /// The register consumer.
        /// </summary>
        /// <param name="configurator">
        /// The configurator.
        /// </param>
        /// <param name="messageType">
        /// The message type.
        /// </param>
        /// <param name="consumer">
        /// The consumer.
        /// </param>
        private static void RegisterConsumer(IReceiverConfigurator configurator, Type messageType, object consumer)
        {
            Type configuratorType = configurator.GetType();

            MethodInfo method = configuratorType.GetMethods().
                Single(
                    mi => // mi.Name == "ReactWith" && //avoiding binding to method name
                    mi.IsGenericMethod && mi.ContainsGenericParameters && mi.GetParameters()
                    .Count() == 1 && mi.GetParameters()
                    .First()
                    .ParameterType.Name == typeof(IConsumerOf<>).Name);

            method.MakeGenericMethod(messageType)
                .Invoke(configurator, new[] { consumer });
        }
Пример #14
0
 /// <summary>
 /// Configure receiver to use a connection string.
 /// </summary>
 /// <param name="builder">
 /// The builder.
 /// </param>
 /// <param name="connectionString">
 /// The connection string.
 /// </param>
 /// <returns>
 /// The <see cref="IReceiverConfigurator"/>.
 /// </returns>
 public static IReceiverConfigurator WithConnectionString(this IReceiverConfigurator builder,
                                                          string connectionString)
 {
     ((RabbitReceiverOptions)((ReceiverConfiguration)builder).Options).ConnectionString = connectionString;
     return(builder);
 }
Пример #15
0
        /// <summary>
        /// The configure bus.
        /// </summary>
        /// <param name="cfg">
        /// The cfg.
        /// </param>
        /// <exception cref="AccessViolationException">
        /// </exception>
        /// <exception cref="NotSupportedException">
        /// </exception>
        private static void ConfigureBus(IBusConfigurator cfg)
        {
            cfg.UseRabbitMq();
            cfg.SetEndpoint(Params.Endpoint);
            cfg.SetConnectionString(Params.ConnectionString);
            cfg.UseParallelismLevel(Params.ParallelismLevel);

            IReceiverConfigurator subscriberCfg = cfg.On(Params.Type);

            if (Params.RequireAccept)
            {
                subscriberCfg.RequiresAccept();
            }

            switch (Params.Type)
            {
            case ConsumerParams.OneWay:
                subscriberCfg.ReactWith <OneWay>(
                    (m, ctx) =>
                {
                    Console.WriteLine("Received {0} with label [{1}].", m.Number, ctx.Message.Label);

                    Thread.Sleep((int)Params.ConsumingDelay);

                    if (Params.Misbehave)
                    {
                        if (Random.Next(10) == 0)
                        {
                            throw new AccessViolationException("un oh...");
                        }
                    }

                    ctx.Accept();
                });
                break;

            case ConsumerParams.Request:

                /*
                 *                  subscriberCfg.ReactWith<WrongRequest>((m, ctx) =>
                 *                  {
                 *                          Console.WriteLine("Received {0}. Sending response...", m.Number);
                 *                          ctx.Reply(new Response(666));
                 *                          ctx.Accept();
                 *                  });
                 */
                subscriberCfg.ReactWith <Request>(
                    (m, ctx) =>
                {
                    Console.WriteLine("Received {0}. Sending response...", m.Number);

                    if (Params.Misbehave)
                    {
                        if (Random.Next(10) == 0)
                        {
                            throw new AccessViolationException("un oh...");
                        }
                    }

                    // Thread.Sleep(50000);
                    ctx.Reply(new Response(m.Number));
                    ctx.Accept();
                });
                break;

            default:
                throw new NotSupportedException("Unknown consumer type: " + Params.Type);
            }
        }