Example #1
0
        static List <int> SendMessages(int messageCount)
        {
            var transport = new MsmqTransport(QueueName, new ConsoleLoggerFactory(true));

            MsmqUtil.EnsureQueueExists(MsmqUtil.GetPath(QueueName));

            var sendIds = new List <int>();

            Enumerable.Range(0, messageCount)
            .Select(id => new SomeMessage {
                Id = id
            })
            .ToList()
            .ForEach(msg =>
            {
                using (var context = new DefaultTransactionContext())
                {
                    transport.Send(QueueName, TransportMessageHelpers.FromString(JsonConvert.SerializeObject(msg)),
                                   context).Wait();

                    context.Complete().Wait();

                    sendIds.Add(msg.Id);
                }
            });

            return(sendIds);
        }
        void SendToErrorQueue(TransportMessage message)
        {
            Logger.InfoFormat("Send message to error queue, {0}", FaultManager.ErrorQueue);

            message.ReplyToAddress = TransportMessageHelpers.GetOriginalReplyToAddressAndRemoveItFromHeaders(message);
            MessageSender.Send(message, FaultManager.ErrorQueue);
        }
Example #3
0
        public void The_default_time_out_should_be_1_day()
        {
            TransportMessageHelpers.SetHeader(_message, SecondLevelRetriesHeaders.RetriesTimestamp, DateTimeExtensions.ToWireFormattedString(DateTime.UtcNow.AddDays(-1).AddSeconds(-1)));
            var hasTimedOut = DefaultRetryPolicy.RetryPolicy(_message) == TimeSpan.MinValue;

            Assert.IsTrue(hasTimedOut);
        }
Example #4
0
        public void Init()
        {
            // The default policy will defer the message 10*N (where N is number of retries) seconds 3 times. (60 sec total)
            // For this sample we changed that to retry faster and only 3 times
            SecondLevelRetries.RetryPolicy = (tm) =>
            {
                if (TransportMessageHelpers.GetNumberOfRetries(tm) >= 3)
                {
                    // To send back a value less than zero tells the
                    // SecondLevelRetry satellite not to retry this message
                    // anymore.
                    return(TimeSpan.MinValue);
                }

                // If an exception is thrown within SLR, we should send the message
                // direct to the error queue since we can't do anything with it.
                // if (TransportMessageHelpers.GetNumberOfRetries(tm) == 1)
                // {
                //     throw new Exception("This exception it thrown from SLR, message should go to error queue");
                // }

                // We will defer this message for 5 seconds, then send it back to the input queue (retry it)
                return(TimeSpan.FromSeconds(5));
            };

            SecondLevelRetries.TimeoutPolicy = (tm) =>
            {
                // This is used as a last chance to abort the retry logic.
                // Retry according to the RetryPolicy Func, but not longer than this.
                // In this case, we're just returning false, the retry timeout for this message never times out.
                return(false);
            };
        }
Example #5
0
        static bool HasReachedMaxTime(TransportMessage message)
        {
            var timestampHeader = TransportMessageHelpers.GetHeader(message, SecondLevelRetriesHeaders.RetriesTimestamp);

            if (String.IsNullOrEmpty(timestampHeader))
            {
                return(false);
            }

            try
            {
                var handledAt = DateTimeExtensions.ToUtcDateTime(timestampHeader);

                if (DateTime.UtcNow > handledAt.AddDays(1))
                {
                    return(true);
                }
            }
            // ReSharper disable once EmptyGeneralCatchClause
            // this code won't usually throw but in case a user has decided to hack a message/headers and for some bizarre reason
            // they changed the date and that parse fails, we want to make sure that doesn't prevent the message from being
            // forwarded to the error queue.
            catch (Exception)
            {
            }

            return(false);
        }
        public void A_message_should_only_be_able_to_retry_during_N_minutes()
        {
            TransportMessageHelpers.SetHeader(message, Faults.FaultsHeaderKeys.FailedQ, "reply@address");
            TransportMessageHelpers.SetHeader(message, SecondLevelRetriesHeaders.RetriesTimestamp, DateTimeExtensions.ToWireFormattedString(DateTime.Now.AddDays(-2)));
            satellite.Handle(message);

            Assert.AreEqual(ERROR_QUEUE, messageSender.MessageSentTo);
        }
Example #7
0
        public void Message_should_be_sent_to_retryQ_if_defer_timespan_is_greater_than_zero()
        {
            TransportMessageHelpers.SetHeader(_message, Faults.FaultsHeaderKeys.FailedQ, "reply@address");
            SecondLevelRetries.RetryPolicy = _ => { return(TimeSpan.FromSeconds(1)); };

            _satellite.Handle(_message);

            Assert.AreEqual(TIMEOUT_MANAGER_QUEUE, _messageSender.MessageSentTo);
        }
Example #8
0
        public void The_original_senders_address_should_be_used_as_ReplyToAddress()
        {
            TransportMessageHelpers.SetHeader(_message, Faults.FaultsHeaderKeys.FailedQ, ORIGINAL_QUEUE.ToString());
            SecondLevelRetries.RetryPolicy = _ => { return(TimeSpan.FromSeconds(1)); };

            _satellite.Handle(_message);

            Assert.AreEqual(ORIGINAL_QUEUE, _message.ReplyToAddress);
        }
Example #9
0
        public void A_message_should_only_be_able_to_retry_during_N_minutes()
        {
            TransportMessageHelpers.SetHeader(_message, Faults.FaultsHeaderKeys.FailedQ, "reply@address");
            SecondLevelRetries.TimeoutPolicy = _ => { return(true); };

            _satellite.Handle(_message);

            Assert.AreEqual(ERROR_QUEUE, _messageSender.MessageSentTo);
        }
        public void Message_should_be_routed_to_the_failing_endpoint_when_the_time_is_up()
        {
            TransportMessageHelpers.SetHeader(message, Faults.FaultsHeaderKeys.FailedQ, ORIGINAL_QUEUE.ToString());
            satellite.RetryPolicy = _ => TimeSpan.FromSeconds(1);

            satellite.Handle(message);

            Assert.AreEqual(ORIGINAL_QUEUE, deferrer.MessageRoutedTo);
        }
        public void Message_should_be_routed_to_the_failing_endpoint_when_the_time_is_up()
        {
            TransportMessageHelpers.SetHeader(_message, Faults.FaultsHeaderKeys.FailedQ, ORIGINAL_QUEUE.ToString());
            SecondLevelRetries.RetryPolicy = _ => { return(TimeSpan.FromSeconds(1)); };

            _satellite.Handle(_message);

            Assert.AreEqual(ORIGINAL_QUEUE.ToString(), _message.Headers[Headers.RouteExpiredTimeoutTo]);
        }
        public void Message_should_be_sent_to_real_errorQ_if_defer_timeSpan_is_less_than_zero()
        {
            TransportMessageHelpers.SetHeader(message, Faults.FaultsHeaderKeys.FailedQ, "reply@address");
            satellite.RetryPolicy = _ => TimeSpan.MinValue;

            satellite.Handle(message);

            Assert.AreEqual(ERROR_QUEUE, messageSender.MessageSentTo);
        }
        public void Message_should_be_sent_to_retryQ_if_defer_timeSpan_is_greater_than_zero()
        {
            TransportMessageHelpers.SetHeader(message, Faults.FaultsHeaderKeys.FailedQ, "reply@address");
            satellite.RetryPolicy = _ => TimeSpan.FromSeconds(1);

            satellite.Handle(message);

            Assert.AreEqual(message, deferrer.DeferredMessage);
        }
        public static TimeSpan Validate(TransportMessage message)
        {
            var numberOfRetries = TransportMessageHelpers.GetNumberOfRetries(message);

            var timeToIncreaseInTicks = TimeIncrease.Ticks * (numberOfRetries + 1);
            var timeIncrease          = TimeSpan.FromTicks(timeToIncreaseInTicks);

            return(numberOfRetries >= NumberOfRetries ? TimeSpan.MinValue : timeIncrease);
        }
        public void Message_should_only_be_retried_X_times_when_using_the_defaultPolicy()
        {
            TransportMessageHelpers.SetHeader(message, Faults.FaultsHeaderKeys.FailedQ, "reply@address");

            for (var i = 0; i < DefaultRetryPolicy.NumberOfRetries + 1; i++)
            {
                satellite.Handle(message);
            }

            Assert.AreEqual(ERROR_QUEUE, messageSender.MessageSentTo);
        }
        public void For_each_retry_the_NServiceBus_Retries_header_should_be_increased()
        {
            TransportMessageHelpers.SetHeader(message, Faults.FaultsHeaderKeys.FailedQ, "reply@address");
            satellite.RetryPolicy = _ => TimeSpan.FromSeconds(1);

            for (var i = 0; i < 10; i++)
            {
                satellite.Handle(message);
            }

            Assert.AreEqual(10, TransportMessageHelpers.GetNumberOfRetries(message));
        }
Example #17
0
        public void Message_should_only_be_retried_X_times_when_using_the_defaultPolicy()
        {
            TransportMessageHelpers.SetHeader(_message, Faults.FaultsHeaderKeys.FailedQ, "reply@address");

            // default policy is to retry once every minute for 30 minutes
            for (int i = 0; i < 31; i++)
            {
                _satellite.Handle(_message);
            }

            Assert.AreEqual(ERROR_QUEUE, _messageSender.MessageSentTo);
        }
        public void Message_retries_header_should_be_removed_before_being_sent_to_real_errorQ()
        {
            TransportMessageHelpers.SetHeader(message, Faults.FaultsHeaderKeys.FailedQ, "reply@address");

            satellite.Handle(message);

            TransportMessageHelpers.SetHeader(message, SecondLevelRetriesHeaders.RetriesTimestamp, DateTimeExtensions.ToWireFormattedString(DateTime.Now.AddDays(-2)));

            satellite.Handle(message);

            Assert.False(message.Headers.ContainsKey(Headers.Retries));
        }
        public void Message_should_have_ReplyToAddress_set_to_original_sender_when_sent_to_real_error_queue_after_retries()
        {
            TransportMessageHelpers.SetHeader(message, Faults.FaultsHeaderKeys.FailedQ, "reply@address");

            var expected = new Address("clientQ", "myMachine");

            message.ReplyToAddress = expected;

            for (var i = 0; i < DefaultRetryPolicy.NumberOfRetries + 1; i++)
            {
                satellite.Handle(message);
            }

            Assert.AreEqual(expected, message.ReplyToAddress);
        }
Example #20
0
        void Defer(TimeSpan defer, TransportMessage message)
        {
            message.ReplyToAddress = TransportMessageHelpers.GetReplyToAddress(message);

            TransportMessageHelpers.SetHeader(message, Headers.Expire, (DateTime.UtcNow + defer).ToWireFormattedString());
            TransportMessageHelpers.SetHeader(message, SecondLevelRetriesHeaders.Retries, (TransportMessageHelpers.GetNumberOfRetries(message) + 1).ToString());

            if (!TransportMessageHelpers.HeaderExists(message, SecondLevelRetriesHeaders.RetriesTimestamp))
            {
                TransportMessageHelpers.SetHeader(message, SecondLevelRetriesHeaders.RetriesTimestamp, DateTime.UtcNow.ToWireFormattedString());
            }

            Logger.InfoFormat("Defer message and send it to {0} using the timeout manager at {1}", message.ReplyToAddress, TimeoutManagerAddress);

            MessageSender.Send(message, TimeoutManagerAddress);
        }
Example #21
0
        protected override void Send(Unicast.Transport.TransportMessage message, Address errorQueue)
        {
            var failedQ = TransportMessageHelpers.GetReplyToAddress(message);

            var sat = Configure.Instance.Builder.Build <SecondLevelRetries>();

            if (failedQ == sat.InputAddress)
            {
                Logger.InfoFormat("The message was sent from the SecondLevelRetries satellite. Sending the message direct to the error queue!");

                base.Send(message, sat.ErrorQueue);
                return;
            }

            base.Send(message, errorQueue);
        }
        void Defer(TimeSpan defer, TransportMessage message)
        {
            TransportMessageHelpers.SetHeader(message, Headers.Expire, (DateTime.UtcNow + defer).ToWireFormattedString());
            TransportMessageHelpers.SetHeader(message, Headers.Retries, (TransportMessageHelpers.GetNumberOfRetries(message) + 1).ToString());

            var faultingEndpointAddress = TransportMessageHelpers.GetAddressOfFaultingEndpoint(message);

            //tell the TM to route this message to the endpoint where this message failed
            TransportMessageHelpers.SetHeader(message, Headers.RouteExpiredTimeoutTo, faultingEndpointAddress.ToString());

            if (!TransportMessageHelpers.HeaderExists(message, SecondLevelRetriesHeaders.RetriesTimestamp))
            {
                TransportMessageHelpers.SetHeader(message, SecondLevelRetriesHeaders.RetriesTimestamp, DateTime.UtcNow.ToWireFormattedString());
            }

            Logger.DebugFormat("Defer message and send it to {0} using the timeout manager at {1}", faultingEndpointAddress, TimeoutManagerAddress);

            MessageSender.Send(message, TimeoutManagerAddress);
        }
        void Defer(TimeSpan defer, TransportMessage message)
        {
            var retryMessageAt = DateTime.UtcNow + defer;

            TransportMessageHelpers.SetHeader(message, Headers.Retries,
                                              (TransportMessageHelpers.GetNumberOfRetries(message) + 1).ToString(CultureInfo.InvariantCulture));

            var addressOfFaultingEndpoint = TransportMessageHelpers.GetAddressOfFaultingEndpoint(message);

            if (!TransportMessageHelpers.HeaderExists(message, SecondLevelRetriesHeaders.RetriesTimestamp))
            {
                TransportMessageHelpers.SetHeader(message, SecondLevelRetriesHeaders.RetriesTimestamp,
                                                  DateTimeExtensions.ToWireFormattedString(DateTime.UtcNow));
            }

            logger.DebugFormat("Defer message and send it to {0}", addressOfFaultingEndpoint);

            MessageDeferrer.Defer(message, retryMessageAt, addressOfFaultingEndpoint);
        }
        public static bool HasTimedOut(TransportMessage message)
        {
            var timestampHeader = TransportMessageHelpers.GetHeader(message, SecondLevelRetriesHeaders.RetriesTimestamp);

            try
            {
                var handledAt = timestampHeader.ToUtcDateTime();

                if (DateTime.UtcNow > handledAt.AddDays(1))
                {
                    return(true);
                }
            }
            catch (Exception)
            {
                return(false);
            }

            return(false);
        }
Example #25
0
        static bool HasReachedMaxTime(TransportMessage message)
        {
            var timestampHeader = TransportMessageHelpers.GetHeader(message, SecondLevelRetriesHeaders.RetriesTimestamp);

            if (String.IsNullOrEmpty(timestampHeader))
            {
                return(false);
            }

            try
            {
                var handledAt = DateTimeExtensions.ToUtcDateTime(timestampHeader);

                if (DateTime.UtcNow > handledAt.AddDays(1))
                {
                    return(true);
                }
            }
            catch (Exception)
            {
            }

            return(false);
        }
Example #26
0
 private void Defer()
 {
     TransportMessageHelpers.SetHeader(_message, Headers.Retries, (TransportMessageHelpers.GetNumberOfRetries(_message) + 1).ToString());
 }