void Defer(TimeSpan defer, TransportMessage message) { var retryMessageAt = DateTime.UtcNow + defer; TransportMessageHeaderHelper.SetHeader(message, Headers.Retries, (TransportMessageHeaderHelper.GetNumberOfRetries(message) + 1).ToString(CultureInfo.InvariantCulture)); var addressOfFaultingEndpoint = TransportMessageHeaderHelper.GetAddressOfFaultingEndpoint(message); if (!TransportMessageHeaderHelper.HeaderExists(message, SecondLevelRetriesHeaders.RetriesTimestamp)) { TransportMessageHeaderHelper.SetHeader(message, SecondLevelRetriesHeaders.RetriesTimestamp, DateTimeExtensions.ToWireFormattedString(DateTime.UtcNow)); } logger.DebugFormat("Defer message and send it to {0}", addressOfFaultingEndpoint); var sendOptions = new SendOptions(addressOfFaultingEndpoint) { DeliverAt = retryMessageAt }; MessageDeferrer.Defer(message, sendOptions); }
public void A_message_should_only_be_able_to_retry_during_N_minutes() { TransportMessageHeaderHelper.SetHeader(message, FaultsHeaderKeys.FailedQ, "reply@address"); TransportMessageHeaderHelper.SetHeader(message, SecondLevelRetriesHeaders.RetriesTimestamp, DateTimeExtensions.ToWireFormattedString(DateTime.Now.AddDays(-2))); satellite.Handle(message); Assert.AreEqual(ERROR_QUEUE, messageSender.MessageSentTo); }
public void The_default_time_out_should_be_1_day() { TransportMessageHeaderHelper.SetHeader(_message, SecondLevelRetriesHeaders.RetriesTimestamp, DateTimeExtensions.ToWireFormattedString(DateTime.UtcNow.AddDays(-1).AddSeconds(-1))); var retriesProcessor = new SecondLevelRetriesProcessor(); var hasTimedOut = retriesProcessor.Validate(_message) == TimeSpan.MinValue; Assert.IsTrue(hasTimedOut); }
public void Message_should_be_sent_to_retryQ_if_defer_timeSpan_is_greater_than_zero() { TransportMessageHeaderHelper.SetHeader(message, FaultsHeaderKeys.FailedQ, "reply@address"); satellite.SecondLevelRetriesConfiguration.RetryPolicy = _ => TimeSpan.FromSeconds(1); satellite.Handle(message); Assert.AreEqual(message, deferrer.DeferredMessage); }
public void Message_should_be_sent_to_real_errorQ_if_defer_timeSpan_is_less_than_zero() { TransportMessageHeaderHelper.SetHeader(message, FaultsHeaderKeys.FailedQ, "reply@address"); satellite.SecondLevelRetriesConfiguration.RetryPolicy = _ => TimeSpan.MinValue; satellite.Handle(message); Assert.AreEqual(ERROR_QUEUE, messageSender.MessageSentTo); }
public void Message_should_be_routed_to_the_failing_endpoint_when_the_time_is_up() { TransportMessageHeaderHelper.SetHeader(message, FaultsHeaderKeys.FailedQ, ORIGINAL_QUEUE.ToString()); satellite.SecondLevelRetriesConfiguration.RetryPolicy = _ => TimeSpan.FromSeconds(1); satellite.Handle(message); Assert.AreEqual(ORIGINAL_QUEUE, deferrer.MessageRoutedTo); }
public void Message_should_only_be_retried_X_times_when_using_the_defaultPolicy() { TransportMessageHeaderHelper.SetHeader(message, FaultsHeaderKeys.FailedQ, "reply@address"); for (var i = 0; i < satellite.SecondLevelRetriesConfiguration.NumberOfRetries + 1; i++) { satellite.Handle(message); } Assert.AreEqual(ERROR_QUEUE, messageSender.MessageSentTo); }
public void Message_should_have_ReplyToAddress_set_to_original_sender_when_sent_to_real_error_queue_after_retries() { TransportMessageHeaderHelper.SetHeader(message, FaultsHeaderKeys.FailedQ, "reply@address"); for (var i = 0; i < satellite.SecondLevelRetriesConfiguration.NumberOfRetries + 1; i++) { satellite.Handle(message); } Assert.AreEqual(CLIENT_QUEUE, message.ReplyToAddress); }
public void For_each_retry_the_NServiceBus_Retries_header_should_be_increased() { TransportMessageHeaderHelper.SetHeader(message, FaultsHeaderKeys.FailedQ, "reply@address"); satellite.SecondLevelRetriesConfiguration.RetryPolicy = _ => TimeSpan.FromSeconds(1); for (var i = 0; i < 10; i++) { satellite.Handle(message); } Assert.AreEqual(10, TransportMessageHeaderHelper.GetNumberOfRetries(message)); }
public void Message_retries_header_should_be_removed_before_being_sent_to_real_errorQ() { TransportMessageHeaderHelper.SetHeader(message, FaultsHeaderKeys.FailedQ, "reply@address"); satellite.Handle(message); TransportMessageHeaderHelper.SetHeader(message, SecondLevelRetriesHeaders.RetriesTimestamp, DateTimeExtensions.ToWireFormattedString(DateTime.Now.AddDays(-2))); satellite.Handle(message); Assert.False(message.Headers.ContainsKey(Headers.Retries)); }
private void Defer() { TransportMessageHeaderHelper.SetHeader(_message, Headers.Retries, (TransportMessageHeaderHelper.GetNumberOfRetries(_message) + 1).ToString()); }