bool HandleCorrelatedMessage(TransportMessage transportMessage, LogicalMessages messages)
        {
            if (transportMessage.CorrelationId == null)
            {
                return false;
            }

            if (transportMessage.CorrelationId == transportMessage.Id) //to make sure that we don't fire callbacks when doing send locals
            {
                return false;
            }

            BusAsyncResult busAsyncResult;

            if (!UnicastBus.messageIdToAsyncResultLookup.TryRemove(transportMessage.CorrelationId, out busAsyncResult))
            {
                return false;
            }

            var statusCode = int.MinValue;

            if (transportMessage.IsControlMessage())
            {
                string errorCode;
                if (transportMessage.Headers.TryGetValue(Headers.ReturnMessageErrorCodeHeader, out errorCode))
                {
                    statusCode = int.Parse(errorCode);
                }
            }

            busAsyncResult.Complete(statusCode, messages.Select(lm=>lm.Instance).ToArray());

            return true;
        }
Пример #2
0
        public void Raise <T>(T @event)
        {
            var chain = new BehaviorChain(Builder, contextStacker);

            chain.Add <LoadHandlersBehavior>();
            chain.Add <InvokeHandlersBehavior>();

            using (var context = new BehaviorContext(Builder, new TransportMessage(), contextStacker))
            {
                var logicalMessages = new LogicalMessages {
                    new LogicalMessage(typeof(T), @event)
                };

                context.Set(logicalMessages);
                chain.Invoke(context);
            }
        }
        public void Invoke(BehaviorContext context, Action next)
        {
            var logicalMessages = new LogicalMessages();

            context.Set(logicalMessages);

            if (SkipDeserialization || UnicastBus.SkipDeserialization)
            {
                return;
            }

            var transportMessage = context.TransportMessage;

            object[] rawMessages;

            try
            {
                rawMessages = Extract(transportMessage);
            }
            catch (Exception exception)
            {
                throw new SerializationException(string.Format("An error occurred while attempting to extract logical messages from transport message {0}", transportMessage), exception);
            }

            if (!transportMessage.IsControlMessage() && !rawMessages.Any())
            {
                log.Warn("Received an empty message - ignoring.");
                return;
            }

            foreach (var rawMessage in rawMessages)
            {
                var messageType = MessageMapper.GetMappedTypeFor(rawMessage.GetType());

                logicalMessages.Add(new LogicalMessage(messageType,rawMessage));
            }

            next();
        }