public void TestErrorHandlerMessage()
        {
            DefaultErrorHandler = new DefaultErrorHandler(LoggerMock.Object, false);
            string testingException = "Testing exception";

            try
            {
                throw new OptimizelyException("Testing exception");
            }
            catch (OptimizelyException ex)
            {
                DefaultErrorHandler.HandleError(ex);
            }

            LoggerMock.Verify(log => log.Log(LogLevel.ERROR, testingException), Times.Once);
        }
Example #2
0
        internal async void HandleException(Exception e, object m)
        {
            ErrorAdvice advice = null;

            try
            {
                foreach (ErrorAdvice adv in AdviceChain)
                {
                    if (adv.GetExceptionType() == e.GetType())
                    {
                        advice = adv;
                    }
                }
                //var advice = (from adv in ErrorAdvice where adv.GetExceptionType() == e.GetType() select adv).FirstOrDefault();
                //if nothing in advice chain matches use default error handler
                if (advice == null)
                {
                    DefaultErrorHandler.HandleError(e, m);
                    return;
                }

                if (advice.RetryOnFail)
                {
                    //need to determine type of retry
                    //var retryAdvice = advice as ITimedRetryAdvice;
                    if (advice.AdviceType == AdviceType.TimedRetry)
                    {
                        var errorCount = 0;
                        _errorDictionary.TryGetValue(m, out errorCount);
                        if (errorCount == 0)
                        {
                            _errorDictionary.Add(m, 0);
                        }
                        else if (errorCount >= advice.RetryCount)
                        {
                            SendToDeadLetterQueue(m.ToString());
                            return;
                        }
                        Log.Warn("TimedRetryAdvice found for message " + m + ", retrying Handle Message");
                        _errorDictionary[m] = errorCount + 1;
                        await Task.Delay((advice.RetryInterval * 1000));

                        HandleMessage(m.ToString());

                        return;
                    }
                    //var retryRequeueAdvice = advice as IRetryRequeueAdvice;
                    if (advice.AdviceType == AdviceType.RetryRequeue)
                    {
                        Log.Warn("RetryRequeue Advice found for message " + m + ", requeing message");
                        SendToMessageQueue(m.ToString());
                        return;
                    }
                }
                //just in case measure
                DefaultErrorHandler.HandleError(e, m);
            }
            catch (Exception ex)
            {
                Log.Error("Error handling exception for" + m.ToString() + ": " + ex.Message);
                DefaultErrorHandler.HandleError(ex, m);
            }
        }