Ejemplo n.º 1
0
        private void CreateConsumerForQueue(string queueName)
        {
            if ((openedChannels.ContainsKey(queueName) && openedChannels[queueName] != null))
            {
                openedChannels[queueName].CallbackException -= CallbackException;
                openedChannels[queueName].Dispose();
            }
            openedChannels[queueName] = persistentConnection.CreateChannel();
            openedChannels[queueName].CallbackException += CallbackException;
            var consumer = new AsyncEventingBasicConsumer(openedChannels[queueName]);

            consumer.Received += ConsumerReceived;
            openedChannels[queueName].BasicConsume(queue: queueName, autoAck: false, consumer: consumer);

            void CallbackException(object?sender, CallbackExceptionEventArgs e)
            {
                CreateConsumerForQueue(queueName);
            }

            async Task ConsumerReceived(object?sender, BasicDeliverEventArgs eventArgs)
            {
                //await Task.Yield(); https://github.com/NickLydon/RabbitMQAsyncDeadlock
                try
                {
                    var body       = eventArgs.Body;
                    var message    = Encoding.UTF8.GetString(body.Span);
                    var routingKey = eventArgs.RoutingKey;

                    Event @event       = JsonSerializer.Deserialize <Event>(message);
                    var   subscription = subscriptionsManager.GetSubscription(queueName, routingKey);
                    if (subscription != null)
                    {
                        await subscription.ProcessEvent(services, @event);
                    }

                    openedChannels[queueName].BasicAck(deliveryTag: eventArgs.DeliveryTag, multiple: false);
                }
                catch (Exception ex)
                {
                    //todo
                    // https://www.rabbitmq.com/dlx.html
                    //channel.BasicNack(deliveryTag: ea.DeliveryTag, multiple: false, true);
                }
            }
        }