예제 #1
0
        public void Should_reset_once_the_message_was_received()
        {
            const int retryLimit = 5;

            var          tracker = new MessageRetryTracker(retryLimit);
            const string id      = "qelofjsw";

            Assert.IsFalse(tracker.IsRetryLimitExceeded(id));
            tracker.IncrementRetryCount(id);

            tracker.MessageWasReceivedSuccessfully(id);

            for (int i = 0; i < retryLimit; i++)
            {
                Assert.IsFalse(tracker.IsRetryLimitExceeded(id));
                tracker.IncrementRetryCount(id);
            }
            Assert.IsTrue(tracker.IsRetryLimitExceeded(id));
        }
예제 #2
0
        public void IsLimitExceeded_return_false_untill_specified_limit_reached()
        {
            const int retryLimit = 5;

            var          tracker = new MessageRetryTracker(retryLimit);
            const string id      = "qelofjsw";

            for (int i = 0; i < retryLimit; i++)
            {
                Assert.IsFalse(tracker.IsRetryLimitExceeded(id));
                tracker.IncrementRetryCount(id);
            }
            Assert.IsTrue(tracker.IsRetryLimitExceeded(id));
        }
        public void Should_return_false_until_the_limit_is_exceeded()
        {
            const int retryLimit = 5;

            var          tracker = new MessageRetryTracker(retryLimit);
            const string id      = "qelofjsw";

            Exception ex;

            for (int i = 0; i < retryLimit; i++)
            {
                Assert.IsFalse(tracker.IsRetryLimitExceeded(id, out ex));
                tracker.IncrementRetryCount(id, ex);
            }
            Assert.IsTrue(tracker.IsRetryLimitExceeded(id, out ex));
        }
예제 #4
0
        private Func <Message, Action <Message> > ReceiveFromTransport(Func <object, Action <object> > receiver)
        {
            return(message =>
            {
                if (_tracker.IsRetryLimitExceeded(message.Id))
                {
                    if (_log.IsErrorEnabled)
                    {
                        _log.ErrorFormat("Message retry limit exceeded {0}:{1}", Address, message.Id);
                    }

                    return MoveMessageToErrorTransport;
                }

                object messageObj;

                try
                {
                    messageObj = Serializer.Deserialize(message.BodyStream);
                }
                catch (SerializationException sex)
                {
                    if (_log.IsErrorEnabled)
                    {
                        _log.Error("Unrecognized message " + Address + ":" + message.Id, sex);
                    }

                    _tracker.IncrementRetryCount(message.Id);
                    return MoveMessageToErrorTransport;
                }

                if (messageObj == null)
                {
                    return null;
                }

                Action <object> receive;
                try
                {
                    receive = receiver(messageObj);
                    if (receive == null)
                    {
                        if (_log.IsDebugEnabled)
                        {
                            _log.DebugFormat("SKIP:{0}:{1}", Address, messageObj.GetType().Name);
                        }

                        if (SpecialLoggers.Messages.IsInfoEnabled)
                        {
                            SpecialLoggers.Messages.InfoFormat("SKIP:{0}:{1}", Address, messageObj.GetType().Name);
                        }

                        return null;
                    }
                }
                catch (Exception ex)
                {
                    if (_log.IsErrorEnabled)
                    {
                        _log.Error("An exception was thrown preparing the message consumers", ex);
                    }

                    _tracker.IncrementRetryCount(message.Id);
                    return null;
                }

                return m =>
                {
                    if (_log.IsDebugEnabled)
                    {
                        _log.DebugFormat("RECV:{0}:{1}:{2}", Address, m.Id, messageObj.GetType().Name);
                    }

                    if (SpecialLoggers.Messages.IsInfoEnabled)
                    {
                        SpecialLoggers.Messages.InfoFormat("RECV:{0}:{1}:{2}", Address, m.Id, messageObj.GetType().Name);
                    }

                    try
                    {
                        receive(messageObj);

                        _tracker.MessageWasReceivedSuccessfully(message.Id);
                    }
                    catch (Exception ex)
                    {
                        if (_log.IsErrorEnabled)
                        {
                            _log.Error("An exception was thrown by a message consumer", ex);
                        }

                        _tracker.IncrementRetryCount(message.Id);
                        MoveMessageToErrorTransport(m);
                    }
                };
            });
        }