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