Exemplo n.º 1
0
        public bool Add <TRabbitHandler, TMessage, TExchange>(
            RabbitEndpointConfiguration endpointConfiguration,
            string queue,
            bool durable    = true,
            bool exclusive  = false,
            bool autoDelete = false,
            bool autoAct    = false,
            IReadOnlyCollection <string>?routingKeys = null,
            IDictionary <string, object>?arguments   = null)
            where TRabbitHandler : IRabbitHandler <TMessage, TExchange>
            where TMessage : Message <TExchange>
            where TExchange : RabbitExchange, new()
        {
            var exchange = new TExchange();

            var handler = new RabbitHandler <TRabbitHandler, TMessage, TExchange>(
                _serviceProvider,
                endpointConfiguration,
                exchange,
                queue,
                durable,
                exclusive,
                autoDelete,
                autoAct,
                routingKeys,
                arguments);

            var type = typeof(
                IRabbitHandler <TMessage, TExchange>);

            return(Handlers
                   .TryAdd(
                       type,
                       handler));
        }
Exemplo n.º 2
0
        public RabbitHandler(
            IServiceProvider serviceProvider,
            RabbitEndpointConfiguration endpointConfiguration,
            RabbitExchange exchange,
            string queue,
            bool durable    = true,
            bool exclusive  = false,
            bool autoDelete = false,
            bool autoAct    = false,
            IReadOnlyCollection <string>?routingKeys = null,
            IDictionary <string, object>?arguments   = null)
        {
            if (exchange == null)
            {
                throw new ArgumentException(
                          $"Message {typeof(TMessage)} not registered in exchange.");
            }

            if (exchange.Type == RabbitExchangeType.Fanout &&
                routingKeys != null &&
                routingKeys.Any())
            {
                throw new ArgumentException(
                          "Fanout cannot use routing key.");
            }

            if (string.IsNullOrWhiteSpace(queue))
            {
                throw new ArgumentException(
                          "Queue cannot be empty.");
            }

            var model = endpointConfiguration.Model;

            model
            .ExchangeDeclare(
                exchange.Name,
                exchange
                .Type
                .ToString()
                .ToLower(),
                exchange.Durable,
                exchange.AutoDelete,
                exchange.Arguments);

            model
            .QueueDeclare(
                queue,
                durable,
                exclusive,
                autoDelete,
                arguments);

            if (routingKeys == null ||
                !routingKeys.Any())
            {
                model
                .QueueBind(
                    queue,
                    exchange.Name,
                    string.Empty,
                    arguments);
            }
            else
            {
                foreach (var routingKey in routingKeys)
                {
                    model
                    .QueueBind(
                        queue,
                        exchange.Name,
                        routingKey,
                        arguments);
                }
            }

            if (!autoAct)
            {
                model
                .BasicQos(
                    0,
                    1,
                    false);
            }

            var consumer = new AsyncEventingBasicConsumer(
                model);

            consumer
            .Received += async(
                obj,
                args) =>
            {
                var message = exchange
                              .Proto
                              .BytesToMessage <TMessage, TExchange>(
                    args.Body);

                try
                {
                    var rabbitHandler = serviceProvider
                                        .GetService <TRabbitHandler>();

                    rabbitHandler
                    .Receive(
                        message,
                        args)
                    .Wait();
                }
                catch (Exception e)
                {
                    throw new RabbitMqException(
                              e.Message,
                              e);
                }

                if (!autoAct)
                {
                    model.BasicAck(
                        args.DeliveryTag,
                        false);
                }

                await Task.Yield();
            };

            model
            .BasicConsume(
                queue,
                autoAct,
                consumer);
        }
 public RabbitPublisher(
     RabbitEndpointConfiguration endpointConfiguration)
 {
     _model = endpointConfiguration.Model;
 }