private void OnMessageAvailable(MessageAvailable value) { using (var childServiceLocator = this.ServiceLocator.CreateNestedContainer()) { currentMessageContext = new MessageContext(this, value.TransportMessage.MessageId, value.TransportMessage.Headers, childServiceLocator); // register a bunch of things we might want to use during the message handling childServiceLocator.RegisterSingleton <IBus>(this); childServiceLocator.RegisterSingleton(this.MessageHandlers); childServiceLocator.RegisterSingleton <IMessageSerializer>(this.MessageSerializer); childServiceLocator.RegisterSingleton <IMessageMapper>(this.MessageMapper); childServiceLocator.RegisterSingleton <ITransport>(this.Transport); childServiceLocator.RegisterSingleton <MessageContext>(currentMessageContext); OutgoingHeaders.Clear(); try { object message = null; try { message = DeserializeMessage(value); } catch (Exception e) { logger.Error(e, "Cannot deserialize message."); // The message cannot be deserialized. There is no reason // to retry. throw new CannotDeserializeMessageException(e); } currentMessageContext.CurrentMessage = message; currentMessageContext.SerializedMessageData = value.TransportMessage.SerializedMessageData; var stopwatch = Stopwatch.StartNew(); var startTimestamp = DateTime.UtcNow; compiledMessagePipeline(currentMessageContext); var endTimestamp = DateTime.UtcNow; stopwatch.Stop(); OnMessageProcessed(new MessageProcessedEventArgs(currentMessageContext, startTimestamp, endTimestamp, stopwatch.Elapsed.TotalMilliseconds)); } finally { currentMessageContext = null; } } }
private object DeserializeMessage(MessageAvailable value) { Type messageType = null; foreach (var typeName in value.TransportMessage.Headers[StandardHeaders.EnclosedMessageTypes].Split(',')) { messageType = this.MessageMapper.GetMappedTypeFor(typeName); if (messageType != null) { break; } } var message = MessageSerializer.Deserialize(value.TransportMessage.SerializedMessageData, messageType); return(message); }