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