/// <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); }
/// <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(); } }); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
// 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 }); }
/// <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); }
/// <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); }
/// <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))); }
/// <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); }
// 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 }); }
/// <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); }
/// <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); } }