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