private void SubscribeForMobileRechargeUpdates()
        {
            var connectionFactory = new ConnectionFactory()
            {
                UserName = _username,
                Password = _password,
                HostName = _hostname
            };

            var connection = connectionFactory.CreateConnection();
            var channel    = connection.CreateModel();
            var consumer   = new EventingBasicConsumer(channel);

            consumer.Received += (model, ea) =>
            {
                var body    = ea.Body;
                var message = Encoding.UTF8.GetString(body);

                // 1. Get the message
                MobileRechargeMessageDTO messageDTO = JsonConvert.DeserializeObject <MobileRechargeMessageDTO>(message);

                // 2. Do the recharge
                _mobileRechargeService.DoRecharge(new RechargeRequestDTO
                {
                    ProviderId = messageDTO.RechargeProviderId,
                    Amount     = messageDTO.RechargeAmount
                }, out int rechargeOrderId);

                PublishMessageForOrderStatus(new OrderStatusMessageDTO {
                    OrderId = messageDTO.OrderId, RechargeOrderId = rechargeOrderId, OrderStatus = OrderStatus.Success
                });
            };
            channel.BasicConsume(queue: _mobileRechargeQueueName, autoAck: true, consumer: consumer);
        }
        public void PublishMessageForMobileRecharge(int orderId, int rechargeAmount, int rechargeProviderId)
        {
            var connectionFactory = new ConnectionFactory()
            {
                UserName = _username,
                Password = _password,
                HostName = _hostname
            };

            using (var connection = connectionFactory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    var properties = channel.CreateBasicProperties();
                    properties.Persistent = false;

                    MobileRechargeMessageDTO message = new MobileRechargeMessageDTO
                    {
                        OrderId            = orderId,
                        RechargeAmount     = rechargeAmount,
                        RechargeProviderId = rechargeProviderId
                    };

                    byte[] messagebuffer = Encoding.Default.GetBytes(JsonConvert.SerializeObject(message));

                    channel.BasicPublish(_exchangeName, _mobileRechargeRoutingKey, properties, messagebuffer);
                }
            }
        }