Beispiel #1
0
        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;
                }
            }
        }
Beispiel #2
0
        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);
        }