/// <summary>
        /// Publishes a message to the queue using the QueueName as the routingKey.
        /// </summary>
        /// <typeparam name="T">The type of the message object.</typeparam>
        /// <param name="msg">The message.</param>
        /// <param name="exchange">[Optional] The exchange name.</param>
        /// <param name="delayMilliseconds">[Optional] The delay milliseconds before the message is available in the queue.</param>
        private void PublishMessage <T> (T msg, string exchange, string queueName, int delayMilliseconds)
        {
            // set persistent property
            IBasicProperties basicProperties = null;

            if (_publishPersistent)
            {
                if (basicProperties == null)
                {
                    basicProperties = ConsumerChannel.CreateBasicProperties();
                }
                basicProperties.Persistent = _publishPersistent;
            }

            if (_retryDelayMilliseconds > 0)
            {
                if (basicProperties == null)
                {
                    basicProperties = ConsumerChannel.CreateBasicProperties();
                }
                basicProperties.AddHeader("x-delay", _retryDelayMilliseconds);
            }

            // publish message
            PublishChannel.BasicPublish(exchange: exchange ?? "",
                                        routingKey: queueName,
                                        basicProperties: basicProperties,
                                        body: GetMessageContent(msg));
        }