private RawBusMessage ReadMessage(Message message) { Action <RawBusMessage, XmlDictionaryReader> provider = (msg, reader) => { MessageSubscribtionInfo messageSubscribtionInfo; if (!_registeredTypes.TryGetValue(new DataContractKey(msg.Name, msg.Namespace), out messageSubscribtionInfo)) { return; } try { msg.Data = messageSubscribtionInfo.Serializer.ReadObject(reader); } catch (Exception ex) { _errorSubscriber.MessageDeserializeException(msg, ex); } }; return(_reader.ReadMessage(message, provider)); }
public BusMessage <TData> ReceiveBusMessage <TData>() { BasicGetResult result = _model.BasicGet(_queue, true); IBasicProperties basicProperties = result.BasicProperties; DataContractKey dataContractKey = basicProperties.GetDataContractKey(); var subscription = _nameMappings.Where(p => p.Value.ContractKey.Equals(dataContractKey)).Select( pair => new { DataType = pair.Key }).FirstOrDefault(); if (subscription == null) { RawBusMessage rawBusMessage = _messageHelper.ConstructMessage(dataContractKey, basicProperties, (object)result.Body); _errorSubscriber.UnregisteredMessageArrived(rawBusMessage); return(null); } object data; if (!_serializers.ContainsKey(basicProperties.ContentType)) { RawBusMessage rawBusMessage = _messageHelper.ConstructMessage(dataContractKey, basicProperties, (object)result.Body); _errorSubscriber.MessageDeserializeException(rawBusMessage, new Exception("Unsupported content type")); return(null); } try { data = _serializers[basicProperties.ContentType].Deserialize(dataContractKey, subscription.DataType, result.Body); } catch (Exception ex) { RawBusMessage rawBusMessage = _messageHelper.ConstructMessage(dataContractKey, basicProperties, (object)result.Body); _errorSubscriber.MessageDeserializeException(rawBusMessage, ex); return(null); } BusMessage <TData> message = _messageHelper.ConstructMessage(dataContractKey, basicProperties, (TData)data); if (!_receiveSelfPublish && _busId.Equals(message.BusId)) { RawBusMessage rawBusMessage = _messageHelper.ConstructMessage(dataContractKey, basicProperties, (object)result.Body); _errorSubscriber.MessageFilteredOut(rawBusMessage); return(null); } return(message); }
private void ConsumeMessage(bool redelivered, ulong deliveryTag, IBasicProperties properties, byte[] body) { DataContractKey dataContractKey = properties.GetDataContractKey(); var subscription = _subscriptions.Where(p => p.Value.FilterInfo.ContractKey.Equals(dataContractKey)).Select( pair => new { DataType = pair.Key, pair.Value.Handler }).FirstOrDefault(); if (subscription == null) { RawBusMessage rawBusMessage = _messageHelper.ConstructMessage(dataContractKey, properties, (object)body); _errorSubscriber.UnregisteredMessageArrived(rawBusMessage); return; } object data; if (!_serializers.ContainsKey(properties.ContentType)) { RawBusMessage rawBusMessage = _messageHelper.ConstructMessage(dataContractKey, properties, (object)body); _errorSubscriber.MessageDeserializeException(rawBusMessage, new Exception("Unsupported content type")); return; } try { data = _serializers[properties.ContentType].Deserialize(dataContractKey, subscription.DataType, body); } catch (Exception ex) { RawBusMessage rawBusMessage = _messageHelper.ConstructMessage(dataContractKey, properties, (object)body); _errorSubscriber.MessageDeserializeException(rawBusMessage, ex); return; } RawBusMessage message = _messageHelper.ConstructMessage(dataContractKey, properties, data); if (!_receiveSelfPublish && _busId.Equals(message.BusId)) { _errorSubscriber.MessageFilteredOut(message); return; } try { HandleMessage(subscription.Handler, message, redelivered, deliveryTag); } catch (Exception ex) { _errorSubscriber.MessageDispatchException(message, ex); } }
protected virtual async Task <bool> ConsumeMessage(bool redelivered, ulong deliveryTag, IBasicProperties properties, byte[] body) { DataContractKey dataContractKey = properties.GetDataContractKey(); var subscription = _subscriptions.Where(p => p.Value.FilterInfo.ContractKey.Equals(dataContractKey)).Select( pair => new { DataType = pair.Key, pair.Value.Handler }).FirstOrDefault(); if (subscription == null) { RawBusMessage rawBusMessage = _messageHelper.ConstructMessage(dataContractKey, properties, (object)body); _errorSubscriber.UnregisteredMessageArrived(rawBusMessage); return(false); } object data; if (!_serializers.ContainsKey(properties.ContentType)) { RawBusMessage rawBusMessage = _messageHelper.ConstructMessage(dataContractKey, properties, (object)body); _errorSubscriber.MessageDeserializeException(rawBusMessage, new Exception("Unsupported content type")); return(false); } ISerializer serializer; try { serializer = _serializers[properties.ContentType]; if (dataContractKey.Equals(DataContractKey.BinaryBlob)) { data = body; } else { data = serializer.Deserialize(subscription.DataType, body); } } catch (Exception ex) { RawBusMessage rawBusMessage = _messageHelper.ConstructMessage(dataContractKey, properties, (object)body); _errorSubscriber.MessageDeserializeException(rawBusMessage, ex); return(false); } RawBusMessage message = _messageHelper.ConstructMessage(dataContractKey, properties, data); if (!_receiveSelfPublish && _busId.Equals(message.BusId)) { _errorSubscriber.MessageFilteredOut(message); return(false); } _trace.MessageArrived(_busId, message, ConsumerTag); RawBusMessage reply; try { reply = await HandleMessage(subscription.Handler, message, redelivered, deliveryTag); } catch (RejectMessageException ex) { reply = new RawBusMessage { Data = ex.ReplyData }; reply.Headers.Add(new RejectedHeader()); } catch (Exception ex) { _errorSubscriber.MessageDispatchException(message, ex); reply = new RawBusMessage(); reply.Headers.Add(new ExceptionHeader { Message = ex.Message }); } if (!_neverReply && reply != null && properties.IsReplyToPresent()) { var sendParams = new SendParams { BusId = _busId, Model = Model, CorrelationId = properties.IsCorrelationIdPresent() ? properties.CorrelationId : "", Exchange = _replyExchange, RoutingKey = properties.ReplyTo, MandatoryDelivery = false, PersistentDelivery = false }; _sendHelper.Send(reply, serializer, sendParams); _trace.MessageSent(_busId, reply); } return(true); }