예제 #1
0
        public void TryPeer_FireWithNullPeer_ThrowsException()
        {
            TimeoutRequest request = new TimeoutRequest(0, null, 1000);
            var            ex      = Assert.Throws <InvalidOperationException>(() => request.TryPeer(null));

            Assert.Equal("Peer cannot be null.", ex.Message);
        }
예제 #2
0
        /// <summary>
        /// Sends the message to the timeout manager, which will send it back after the specified
        /// time span has elapsed. Note that you must have a running timeout manager for this to
        /// work.
        /// </summary>
        public void Defer(TimeSpan delay, object message)
        {
            Guard.NotNull(message, "message");
            Guard.GreaterThanOrEqual(delay, TimeSpan.FromSeconds(0), "delay");

            if (configureAdditionalBehavior.OneWayClientMode && !HasHeaderFor(message, Headers.ReturnAddress))
            {
                throw new InvalidOperationException(
                          string.Format(
                              "Defer cannot be used when the bus is in OneWayClientMode, since there would be no" +
                              " destination for the TimeoutService to return to. You CAN defer messages in one-way" +
                              " mode though, if you explicitly specify a return address on the message with the" +
                              " {0} header",
                              Headers.ReturnAddress));
            }


            var attachedHeaders = headerContext.GetHeadersFor(message);
            var customData      = TimeoutReplyHandler.Serialize(new Message {
                Headers = attachedHeaders, Messages = new[] { message }
            });

            var timeoutRequest = new TimeoutRequest
            {
                Timeout       = delay,
                CustomData    = customData,
                CorrelationId = TimeoutReplyHandler.TimeoutReplySecretCorrelationId
            };

            if (MessageContext.HasCurrent)
            {
                var messageContext = MessageContext.GetCurrent();

                // if we're in a saga context, be nice and set the saga ID automatically
                if (messageContext.Items.ContainsKey(SagaContext.SagaContextItemKey))
                {
                    var sagaContext = ((SagaContext)messageContext.Items[SagaContext.SagaContextItemKey]);
                    timeoutRequest.SagaId = sagaContext.Id;
                }

                // if we're currently handling a message with a rebus message ID, transfer it to the deferred message
                if (!HasHeaderFor(message, Headers.MessageId))
                {
                    if (messageContext.Headers.ContainsKey(Headers.MessageId))
                    {
                        headerContext.AttachHeader(message, Headers.MessageId, messageContext.RebusTransportMessageId);
                    }
                }
            }

            var messages = new List <object> {
                timeoutRequest
            };

            InternalSend(new List <string> {
                timeoutManagerAddress
            }, messages);
        }
예제 #3
0
 public ActionResult Apply([Bind(Include = "TimeoutSettingId,Number,Notes")] TimeoutRequest dto)
 {
     try
     {
         var res = _timeoutRequestContract.Create(dto, sendNotificationAction);
         return(Json(res));
     }
     catch (Exception e)
     {
         return(Json(OperationResult.Error(e.Message)));
     }
 }
예제 #4
0
        public void TryPeer_BeforeTimeout_HasTimeoutShouldBeFalse()
        {
            Mock <IPeer> fakePeer = new Mock <IPeer>();

            fakePeer.Setup(m => m.EnqueueOutgoing(It.IsAny <Message>(), null));

            TimeoutRequest request = new TimeoutRequest(0, new Message(), 20);

            request.TryPeer(fakePeer.Object);

            Assert.False(request.HasTimedOut);
        }
예제 #5
0
        public void TryPeer_ShouldEnqueueMessage()
        {
            Mock <IPeer> fakePeer = new Mock <IPeer>();

            fakePeer.Setup(m => m.EnqueueOutgoing(It.IsAny <Message>(), null));

            TimeoutRequest request = new TimeoutRequest(0, new Message(), 1000);

            request.TryPeer(fakePeer.Object);

            fakePeer.Verify(mock => mock.EnqueueOutgoing(It.IsAny <Message>(), null), Times.Once());
        }
예제 #6
0
        public void TryPeer_AfterTimeout_HasTimeoutShouldBeTrue()
        {
            Mock <IPeer> fakePeer = new Mock <IPeer>();

            fakePeer.Setup(m => m.EnqueueOutgoing(It.IsAny <Message>(), null));

            TimeoutRequest request = new TimeoutRequest(0, new Message(), 5);

            request.TryPeer(fakePeer.Object);

            Thread.Sleep(20);

            Assert.True(request.HasTimedOut);
        }
예제 #7
0
        public void TryPeer_RetryDuringRequest_ShouldThrowException()
        {
            Mock <IPeer> fakePeer = new Mock <IPeer>();

            fakePeer.Setup(m => m.EnqueueOutgoing(It.IsAny <Message>(), null));

            TimeoutRequest request = new TimeoutRequest(0, new Message(), 20);

            request.TryPeer(fakePeer.Object);

            var ex = Assert.Throws <InvalidOperationException>(() => request.TryPeer(fakePeer.Object));

            Assert.Equal("Cannot switch peer before timeout.", ex.Message);
        }
예제 #8
0
        public void TryPeer_ExceedRetry_ShouldThrowException()
        {
            Mock <IPeer> fakePeer = new Mock <IPeer>();

            fakePeer.Setup(m => m.EnqueueOutgoing(It.IsAny <Message>(), null));

            TimeoutRequest request = new TimeoutRequest(0, new Message(), 1);

            request.MaxRetryCount = 1;

            request.TryPeer(fakePeer.Object);

            Thread.Sleep(10);

            var ex = Assert.Throws <InvalidOperationException>(() => request.TryPeer(fakePeer.Object));

            Assert.Equal("Cannot retry : max retry count reached.", ex.Message);
        }
예제 #9
0
        public void TryPeer_WaitLongerThanTimout_ShouldNotFire()
        {
            Mock <IPeer> fakePeer = new Mock <IPeer>();

            fakePeer.Setup(m => m.EnqueueOutgoing(It.IsAny <Message>(), null));

            TimeoutRequest request = new TimeoutRequest(0, new Message(), 50);

            bool wasFired = false;

            request.RequestTimedOut += (sender, args) => wasFired = true;

            request.TryPeer(fakePeer.Object);

            // Wait for less time than than the timeout
            Thread.Sleep(10);

            Assert.False(wasFired);
        }
예제 #10
0
파일: RebusBus.cs 프로젝트: kcsdecos/Rebus
        /// <summary>
        /// Sends the message to the timeout manager, which will send it back after the specified
        /// time span has elapsed. Note that you must have a running timeout manager for this to
        /// work.
        /// </summary>
        public void Defer(TimeSpan delay, object message)
        {
            Guard.NotNull(message, "message");
            Guard.GreaterThanOrEqual(delay, TimeSpan.FromSeconds(0), "delay");

            if (busMode == BusMode.OneWayClientMode && !HasReturnAddressHeader(message))
            {
                throw new InvalidOperationException("Defer cannot be used when the bus is in OneWayClientMode, since there " +
                                                    "would be no destination for the TimeoutService to return to.");
            }

            var customData = TimeoutReplyHandler.Serialize(message);

            var timeoutRequest = new TimeoutRequest
            {
                Timeout       = delay,
                CustomData    = customData,
                CorrelationId = TimeoutReplyHandler.TimeoutReplySecretCorrelationId
            };

            if (MessageContext.HasCurrent)
            {
                var messageContext = MessageContext.GetCurrent();

                // if we're in a saga context, be nice and set the saga ID automatically
                if (messageContext.Items.ContainsKey(SagaContext.SagaContextItemKey))
                {
                    var sagaContext = ((SagaContext)messageContext.Items[SagaContext.SagaContextItemKey]);
                    timeoutRequest.SagaId = sagaContext.Id;
                }
            }

            var messages = new List <object> {
                timeoutRequest
            };

            InternalSend(timeoutManagerAddress, messages);
        }