public void Run(MessageConfiguration config) { Bind(config.Handler.FullName, config.RoutingKey, connectionConfiguration.Exchange); Channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false); var consumer = new EventingBasicConsumer(Channel); consumer.Received += (sender, e) => { try { var message = Encoding.UTF8.GetString(e.Body); messageLogger.Info($" [x] Received '{e.RoutingKey}':'{message}'"); var handler = handlerFactory.Resolve(config.Handler.FullName); handler.Handle(message); handlerFactory.Release(handler); Channel.BasicAck(deliveryTag: e.DeliveryTag, multiple: false); } catch (Exception exception) { Channel.BasicReject(deliveryTag: e.DeliveryTag, requeue: false); if (e.BasicProperties.Headers == null) { e.BasicProperties.Headers = new Dictionary <string, object>(); } e.BasicProperties.Headers.Add("Queue", config.Handler.FullName); Channel.BasicPublish(exchange: connectionConfiguration.PoisionExchange, routingKey: config.RoutingKey, basicProperties: e.BasicProperties, body: e.Body); messageLogger.Error(exception); throw; } }; Channel.BasicConsume(queue: config.Handler.FullName, autoAck: false, consumer: consumer); }