/// <summary>
        /// Получение из свойств тела сообщения и свойств сообщения сообщения в формате шины.
        /// </summary>
        /// <param name="bodyProperties">Свойства тела сообщения.</param>
        /// <param name="properties">Свойства сообщения (тэги).</param>
        /// <returns>Сообщение в формате шины.</returns>
        public MessageWithNotTypedPk ConvertFromMqFormat(byte[] messagePayload, IDictionary <string, object> properties)
        {
            var result = new MessageWithNotTypedPk();

            BasicProperties rmqProperties = new RabbitMQ.Client.Framing.BasicProperties();

            rmqProperties.Headers = properties;
            var mapMessageReader = new MapMessageReader(rmqProperties, messagePayload);

            var bodyProperties = mapMessageReader.Body;

            if (bodyProperties.ContainsKey(this._bodyPropertyName))
            {
                result.Body = (string)mapMessageReader.Body[this._bodyPropertyName];
            }

            if (bodyProperties.ContainsKey(this._attachmentPropertyName))
            {
                result.BinaryAttachment = (byte[])mapMessageReader.Body[this._attachmentPropertyName];
            }

            if (bodyProperties.ContainsKey(this._senderIdPropepertyName))
            {
                result.Sender = (string)mapMessageReader.Body[this._senderIdPropepertyName];
            }

            var headers = mapMessageReader.Properties.Headers;

            if (headers != null)
            {
                var messageTags = new Dictionary <string, string>();
                foreach (var property in headers)
                {
                    if (property.Key.StartsWith(this._tagPropertiesPrefix))
                    {
                        var tagKey = property.Key.Substring(this._tagPropertiesPrefix.Length);
                        var value  = Encoding.UTF8.GetString((byte[])property.Value);
                        messageTags.Add(tagKey, value);
                    }
                }

                if (headers.ContainsKey(this.TimestampPropertyName))
                {
                    var unixtimestamp = (long)headers[this.TimestampPropertyName];
                    result.ReceivingTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc).AddMilliseconds(unixtimestamp);
                }

                result.Tags = messageTags.Any() ? messageTags.Select(x => $"{x.Key}:{x.Value}").Aggregate((x, y) => $"{x}, {y}") : "";
            }

            return(result);
        }
        /// <summary>
        /// Получение сообщения для подписчика.
        /// </summary>
        /// <param name="clientId">Идентификатор клиента.</param>
        /// <param name="messageTypeId">Идентификатор типа сообщения.</param>
        /// <returns>Сообщения или null, если сообщения нет.</returns>
        public Message ReadMessage(string clientId, string messageTypeId)
        {
            MessageWithNotTypedPk result = null;

            var queueName = _namingManager.GetClientQueueName(clientId, messageTypeId);
            var message   = SharedModel.BasicGet(queueName, false);

            if (message != null)
            {
                result             = _converter.ConvertFromMqFormat(message.Body, message.BasicProperties.Headers);
                result.MessageType = new MessageType()
                {
                    ID = messageTypeId
                };
                result.__PrimaryKey = message.DeliveryTag;
            }

            return(result);
        }