Beispiel #1
0
        public void CanPreserveCustomHeadersOnDeferredMessage()
        {
            // arrange
            var deferredMessageReceived = new ManualResetEvent(false);
            IDictionary <string, object> receivedHeaders = null;

            handlerActivator.Handle <MessageWithText>(m =>
            {
                receivedHeaders = MessageContext.GetCurrent().Headers;

                deferredMessageReceived.Set();
            });

            var message = new MessageWithText {
                Text = "hello"
            };

            bus.AttachHeader(message, Headers.UserName, "joe");
            bus.AttachHeader(message, "test-custom1", "bimmelim!");
            bus.AttachHeader(message, "test-custom2", "w00t!");

            // act
            bus.Defer(1.Seconds(), message);
            deferredMessageReceived.WaitUntilSetOrDie(3.Seconds());

            // assert
            receivedHeaders.ShouldNotBe(null);
            receivedHeaders.ShouldContainKeyAndValue(Headers.UserName, "joe");
            receivedHeaders.ShouldContainKeyAndValue("test-custom1", "bimmelim!");
            receivedHeaders.ShouldContainKeyAndValue("test-custom2", "w00t!");
        }
        public void WorksWhenMovingToErrorQueue()
        {
            using (var messageQueue = new MsmqMessageQueue("error"))
            {
                // make sure error queue is empty
                messageQueue.PurgeInputQueue();

                adapter.Handle <Request>(req =>
                {
                    throw new ApplicationException("oh crap");
                });

                var request = new Request();
                bus.AttachHeader(request, Headers.CorrelationId, "super-unique!!!!111");
                bus.SendLocal(request);

                // let it fail
                Thread.Sleep(2.Seconds());

                var receivedTransportMessage = messageQueue.ReceiveMessage(new NoTransaction());
                receivedTransportMessage.ShouldNotBe(null);

                var serializer = new JsonMessageSerializer();
                var message    = serializer.Deserialize(receivedTransportMessage);

                message.Headers.ShouldContainKeyAndValue(Headers.CorrelationId, "super-unique!!!!111");
            }
        }
Beispiel #3
0
        public void DispatchLocal(object deferredMessage, Guid sagaId)
        {
            if (sagaId != Guid.Empty)
            {
                bus.AttachHeader(deferredMessage, Headers.AutoCorrelationSagaId, sagaId.ToString());
            }

            bus.SendLocal(deferredMessage);
        }
        public void DispatchLocal(object deferredMessage, Guid sagaId, IDictionary <string, object> headers)
        {
            if (sagaId != Guid.Empty)
            {
                bus.AttachHeader(deferredMessage, Headers.AutoCorrelationSagaId, sagaId.ToString());
            }

            foreach (var header in headers)
            {
                bus.AttachHeader(deferredMessage, header.Key, (header.Value ?? "").ToString());
            }

            bus.SendLocal(deferredMessage);
        }
Beispiel #5
0
        /// <summary>
        /// Replies to origin saga correlating with sagaId parameter.
        /// </summary>
        public static void ReplyToSaga <TResponse>(this IBus bus, string originator, Guid sagaId, TResponse message)
        {
            Guard.IsNotNull(bus, nameof(bus));
            Guard.IsNotNullNorEmpty(originator, nameof(originator));
            Guard.IsNotDefault(sagaId, nameof(sagaId));
            Guard.IsNotNull(message, nameof(message));

            var messageContext    = MessageContext.GetCurrent();
            var sagaContextKey    = SagaContext.SagaContextItemKey;
            var sagaContextExists = messageContext.Items.ContainsKey(sagaContextKey);

            // Current saga context
            var currentSagaContext = sagaContextExists ? messageContext.Items[sagaContextKey] : null;

            try
            {
                // XXX: The .Routing.Send() method is overwriting the AutoCorrelationSagaId header by current SagaConext.Id,
                //		so we need to (temporarilly) remove the existing sagaContext from messageContext.
                messageContext.Items.Remove(sagaContextKey);
                bus.AttachHeader(message, Headers.AutoCorrelationSagaId, sagaId.ToString());
                bus.ReplyTo(originator, message);
            }
            finally
            {
                if (sagaContextExists)
                {
                    // XXX: Restore the current SagaConext, no matter what.
                    messageContext.Items[sagaContextKey] = currentSagaContext;
                }
            }
        }
Beispiel #6
0
        protected override void PerformProceed(IInvocation invocation)
        {
            Guard.Against <InvalidOperationException>(
                invocation.Method.Name != "Handle" || !invocation.Method.IsPublic || invocation.Arguments.Length != 1,
                $"Invoked {GetType().Name} interceptor for a non-handle method ({invocation.Method.Name})?!"
                );

            if (IsLockedSaga(invocation.InvocationTarget as Saga) && !IsFlaggedAsDeferred())
            {
                var message = invocation.GetArgumentValue(0);

                _Log.DebugFormat("Deferring handling of message of type {0}, due to target saga being currently locked.", message?.GetType());

                if (MessageContext.HasCurrent)
                {
                    // The Rebus transport message ID can not be overwritten
                    foreach (var header in MessageContext.GetCurrent().Headers.Where(x => x.Key != Headers.MessageId))
                    {
                        _bus.AttachHeader(message, header.Key, Convert.ToString(header.Value));
                    }
                }

                _bus.Defer(_settings.LockedSagasDeferInterval, message);

                MessageContext.GetCurrent().Abort();

                // Flag the MessageContext as deferred to avoid generating multiple timeouts
                // when a message that is handled by multiple sagas has at least one of them locked
                FlagAsDeferred();

                return;
            }

            base.PerformProceed(invocation);
        }
Beispiel #7
0
        static void EncodeUserContextHeadersIfPossible(IBus bus, string destination, object message)
        {
            var current = AmbientUserContext.Current;
            if (current == null) return;

            var encodedUserContext = Encode(current);
            
            bus.AttachHeader(message, UserContextHeaderKey, encodedUserContext);
        }
Beispiel #8
0
        static void EncodeUserContextHeadersIfPossible(IBus bus, string destination, object message)
        {
            var current = AmbientUserContext.Current;

            if (current == null)
            {
                return;
            }

            var encodedUserContext = Encode(current);

            bus.AttachHeader(message, UserContextHeaderKey, encodedUserContext);
        }
        protected virtual void PrepareCommand(ICommand command, string impersonatingUser)
        {
            var userId = command.GetContextData("user.id");

            if (userId == null)
            {
                userId = ImpersonateUser(command, impersonatingUser);
                command.SetContextData("user.id", userId);
            }

            if (!UserIsAllowedToSendCommand(command, userId))
            {
                throw new UserCannotSendCommandException();
            }

            foreach (var key in command.AllContextKeys)
            {
                _bus.AttachHeader(command, key, command.GetContextData(key));
            }

            _bus.AttachHeader(command, "command.id", command.MessageId.ToString());
            _bus.AttachHeader(command, "command.description", command.Describe());
        }
        static void InnerSend <TReply>(IBus bus, object message, Action <TReply> replyHandler, TimeSpan timeout, Action timeoutAction = null)
        {
            if (bus == null)
            {
                throw new ArgumentNullException("bus", "You cannot call these methods without a bus instance");
            }
            if (message == null)
            {
                throw new ArgumentNullException("message", "You cannot call these methods without a message");
            }
            if (replyHandler == null)
            {
                throw new ArgumentNullException("replyHandler", "Please specify a reply handler");
            }

            var correlationId = Guid.NewGuid().ToString();

            bus.AttachHeader(message, Headers.CorrelationId, correlationId);

            var replyCallback = new ReplyCallback
            {
                Callback         = replyHandler,
                RegistrationTime = DateTime.UtcNow,
                MaxCallbackAge   = timeout,
                TimeoutCallback  = timeoutAction,
            };
            var key = GetKey(correlationId, typeof(TReply));

            if (TransactionContext.Current != null)
            {
                TransactionContext.Current.DoCommit +=
                    () => registeredReplyHandlers.TryAdd(key, replyCallback);
            }
            else
            {
                registeredReplyHandlers.TryAdd(key, replyCallback);
            }

            bus.Send(message);
        }
        /// <summary>
        /// http://mookid.dk/oncode/archives/2966
        /// </summary>
        /// <param name="bus"></param>
        /// <param name="destination"></param>
        /// <param name="message"></param>
        private void OnMessageSent(IBus bus, string destination, object message)
        {
            if (MessagesTracker != null)
            {
                var msg = message as IMessage;
                if (msg != null)
                {
                    MessagesTracker.Started(msg);
                }
            }

            var attribute = message.GetType()
                            .GetCustomAttributes(typeof(TimeToBeReceivedAttribute), false)
                            .Cast <TimeToBeReceivedAttribute>()
                            .SingleOrDefault();

            if (attribute == null)
            {
                return;
            }

            bus.AttachHeader(message, Headers.TimeToBeReceived, attribute.HmsString);
        }
Beispiel #12
0
 private static void SetDateOnMessageSent(IBus bus, string destination, object message)
 {
     bus.AttachHeader(message, MessageDataHeader, DateTime.UtcNow.ToString("o"));
 }