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