示例#1
0
        public static QueueingOptions UseRabbitMQQueue <TData>(
            this QueueingOptions options,
            Action <QueueingProviderOptions <TData> > optionsAction = null,
            TimeSpan?expiration = null,
            int?retries         = null,
            string section      = "naos:queueing:rabbitMQ")
            where TData : class
        {
            EnsureArg.IsNotNull(options, nameof(options));
            EnsureArg.IsNotNull(options.Context, nameof(options.Context));

            var queueName     = typeof(TData).PrettyName();
            var configuration = options.Context.Configuration.GetSection(section).Get <RabbitMQConfiguration>();

            if (configuration?.Enabled == true)
            {
                var connectionFactory = new ConnectionFactory
                {
                    Port     = configuration.Port == 0 ? 5672 : configuration.Port,
                    HostName = configuration.Host.IsNullOrEmpty() ? "localhost" : configuration.Host, // or 'rabbitmq' in docker-compose env
                    UserName = configuration.UserName.IsNullOrEmpty() ? "guest" : configuration.UserName,
                    Password = configuration.Password.IsNullOrEmpty() ? "guest" : configuration.Password,
                    DispatchConsumersAsync = true,
                };

                options.Context.Services.AddScoped <IQueue <TData> >(sp =>
                {
                    var provider = new RabbitMQProvider(
                        sp.GetRequiredService <ILogger <RabbitMQProvider> >(),
                        connectionFactory,
                        configuration.RetryCount,
                        $"{LogKeys.Queueing} {queueName} ({sp.GetService<Naos.Foundation.ServiceDescriptor>()?.Name})");

                    return(new RabbitMQQueue <TData>(o => o
                                                     .Mediator(sp.GetService <IMediator>())
                                                     .Tracer(sp.GetService <ITracer>())
                                                     .LoggerFactory(sp.GetService <ILoggerFactory>())
                                                     .Provider(provider)
                                                     .QueueName(queueName)
                                                     .Expiration(expiration)
                                                     .Retries(retries)));
                });

                optionsAction?.Invoke(
                    new QueueingProviderOptions <TData>(options.Context));

                options.Context.Services.AddHealthChecks()
                .AddRabbitMQ(configuration.AsConnectionString(), null, $"queueing-provider-rabbitmq-{queueName}", tags: new[] { "naos" });

                options.Context.Messages.Add($"naos services builder: queueing provider added (provider={nameof(RabbitMQQueue<TData>)}, queue={queueName})");
            }
            else
            {
                throw new NaosException("no queueing rabbitmq is enabled");
            }

            return(options);
        }
        public PublishTest()
        {
            var _rabbitMQProvider = new RabbitMQProvider(new RabbitMQOptions
            {
                Host     = "127.0.0.1",
                Port     = 5672,
                Username = "******",
                Password = "******"
            });

            _publish = new PublishService(_rabbitMQProvider);
        }
        public ConsumeTest()
        {
            var _rabbitMQProvider = new RabbitMQProvider(new RabbitMQOptions
            {
                Host     = "127.0.0.1",
                Port     = 5672,
                Username = "******",
                Password = "******"
            });

            _consume = new ConsumeService(_rabbitMQProvider);
        }
        public static CommandRequestOptions UseRabbitMQQueue(
            this CommandRequestOptions options,
            string name         = "commandrequests",
            TimeSpan?expiration = null,
            int?retries         = null)
        {
            var queueName     = typeof(CommandRequestWrapper).PrettyName();
            var configuration = options.Context.Configuration.GetSection("naos:commands:rabbitMQQueue").Get <RabbitMQConfiguration>();

            if (configuration?.Enabled == true)
            {
                var connectionFactory = new ConnectionFactory
                {
                    Port     = configuration.Port == 0 ? 5672 : configuration.Port,
                    HostName = configuration.Host.IsNullOrEmpty() ? "localhost" : configuration.Host, // or 'rabbitmq' in docker-compose env
                    UserName = configuration.UserName.IsNullOrEmpty() ? "guest" : configuration.UserName,
                    Password = configuration.Password.IsNullOrEmpty() ? "guest" : configuration.Password,
                    DispatchConsumersAsync = true,
                };

                options.Context.Services.AddScoped <IQueue <CommandRequestWrapper> >(sp =>
                {
                    var provider = new RabbitMQProvider(
                        sp.GetRequiredService <ILogger <RabbitMQProvider> >(),
                        connectionFactory,
                        configuration.RetryCount,
                        $"{LogKeys.Queueing} {queueName} ({sp.GetService<Naos.Foundation.ServiceDescriptor>()?.Name})");

                    return(new RabbitMQQueue <CommandRequestWrapper>(o => o
                                                                     .Mediator(sp.GetService <IMediator>())
                                                                     .Tracer(sp.GetService <ITracer>())
                                                                     .LoggerFactory(sp.GetService <ILoggerFactory>())
                                                                     .Serializer(new JsonNetSerializer(TypedJsonSerializerSettings.Create())) // needs type information in json to deserialize correctly (which is needed for mediator.send)
                                                                     .Provider(provider)
                                                                     .QueueName($"{options.Context.Descriptor.Name}-{name}")
                                                                     .Expiration(expiration)
                                                                     .Retries(retries)));
                });
            }

            return(options);
        }