Esempio n. 1
0
        public void Run(IMessageSource messageSource, IMessageReplyHandler replyHandler,
                        CancellationToken ct)
        {
            while (!ct.IsCancellationRequested)
            {
                var message = messageSource.PeekLockMessage(ct, 10000);
                if (message == null)
                {
                    continue;
                }

                Message reply = null;
                try
                {
                    reply = ExecuteRequest(message);
                }
                catch (Exception ex)
                {
                    _logger.Error(string.Format("Возникла ошибка при обработке сообщения {0}", message), ex);

                    var errorCode = MessageHandlingError.UnknowError;
                    if (ex is MessageHandlingException)
                    {
                        errorCode = (ex as MessageHandlingException).GetErrorCode();
                    }
                    // Удаляем сообщение с кодом ошибки
                    messageSource.CompletePeekLock(message.Id, errorCode, ex.Message);
                    continue;
                }

                try
                {
                    while (!ct.IsCancellationRequested)
                    {
                        if (replyHandler.HandleReplyMessage(reply))
                        {
                            break;
                        }
                        ct.WaitHandle.WaitOne(TimeSpan.FromSeconds(1));
                    }
                }
                catch (MessageHandlingException ex)
                {
                    _logger.Error(string.Format("Возникла ошибка при обработке ответного сообщения {0}", reply), ex);
                }
                messageSource.CompletePeekLock(message.Id);
            }
        }