Пример #1
0
        /// <summary>
        /// При отправке сообщения произошло исключение
        /// </summary>
        /// <param name="messageDomain">Тип доменного сообщения</param>
        /// <param name="exception">Исключение</param>
        public void SendFail(TMessageDomain messageDomain, Exception exception)
        {
            //По умолчанию все сообщения нужно попробовать отправить ещё раз
            var status = MessageStatus.SendErrorTryAgain;

            //только обработанные ошибки не подлежат повторной отправке
            if (exception is IntegrationServerErrorException)
            {
                status = MessageStatus.SendError;
            }
            messageDomain.Status    = status;
            messageDomain.ErrorText = exception.Message;
            _messageDomainService.Update(messageDomain);
            _logger.Error(exception);
        }
Пример #2
0
        public void SendMessages(CoreInitData coreInitData)
        {
            var stopWatch = new Stopwatch();

            stopWatch.Start();
            try
            {
                //получаем доменные сообщения для отправки
                //не обязательно могут быть только новые
                //также поднимаются не отправленные с первого раза
                var messages = _messageDomainService.GetMessageDomainsForSend(coreInitData);
                foreach (var messageDomain in messages)
                {
                    try
                    {
                        //по каждому из доменных сообщений создаем прокси сообщение
                        var proxyMessageRequests = _messageProxyConverter.ToMessageProxy(messageDomain);
                        //отправляем прокси сообщение
                        var proxyAck = _sendMessageProxyProvider.SendMessage(proxyMessageRequests);
                        //обрабатываем успешный результат
                        _sendMessageHandler.SendSuccess(messageDomain, proxyAck);
                    }
                    catch (Exception exception)
                    {
                        //обрабатываем исключения
                        _sendMessageHandler.SendFail(messageDomain, exception);
                    }
                }

                stopWatch.Stop();
                _logger.Info(this.GetType(), $"По {messages.Count} доменным сообщениям УК {coreInitData.UkId} отправлено " +
                             $"{messages.Count(x => x.Status == MessageStatus.Sent)} сообщений, " +
                             $"{messages.Count(x => x.Status == MessageStatus.SendError)} упали с ошибкой, " +
                             $"{messages.Count(x => x.Status == MessageStatus.SendErrorTryAgain)} будут отправлены повторно, за {stopWatch.Elapsed}");
            }
            catch (Exception ex)
            {
                _logger.Error(this.GetType(), $"Произошло исключение при обработке {coreInitData}", ex);
            }
        }
Пример #3
0
        public void CreateMessages(CoreInitData coreInitData)
        {
            var stopWatch = new Stopwatch();

            stopWatch.Start();
            try
            {
                //получаем данные из информационной системы, по которым нужно осуществить взаимодействие
                var sourceDomains = _sourceService.GetSourceDomains(coreInitData);
                //получаем senderId по УК
                var orgPPAGUID = _orgPPAGUIDService.GetOrgPPAGUID(coreInitData.UkId);
                //по исходным данным создаем доменные сообщения
                var messages = _messageDomainConverter.ToMessageDomain(sourceDomains, coreInitData, orgPPAGUID);
                //сохраняем сообщения в базу данных
                _messageDomainService.InsertMessageDomains(messages);

                stopWatch.Stop();
                _logger.Info(this.GetType(), $"Создано {messages.Count} доменных сообщений по УК {coreInitData.UkId} за {stopWatch.Elapsed}");
            }
            catch (Exception ex)
            {
                _logger.Error(this.GetType(), $"Произошло исключение при обработке {coreInitData}", ex);
            }
        }
        public void GetResults(CoreInitData coreInitData)
        {
            var stopWatch = new Stopwatch();

            stopWatch.Start();
            try
            {
                //получаем доменнные сообщения для проверки результата обработки
                var messages = _messageDomainService.GetMessageDomainsForGetResults(coreInitData);
                foreach (var messageDomain in messages)
                {
                    try
                    {
                        //по доменному сообщению получаем getState для проверки результатов обработки сообщения
                        var          getStateProxy = _getStateProxyConverter.ToGetStateResultProxy(messageDomain);
                        TResultProxy resultProxy;
                        //проверяем результат обработки.
                        //если возвращается false, значит сообщение ещё не обработано
                        //если true, значит можно получать результат обработки
                        if (_getResultProxyProvider.TryGetResult(getStateProxy, out resultProxy))
                        {
                            //полученный ответ преобразовываем из прокси сущности в нашу бизнес-сущность результата обработки
                            var result = _resultConverter.ToResult(resultProxy);
                            //сохраняем результат обработки сообщения
                            _saveResultService.SaveResult(result, messageDomain);
                            //проставляем статусы обработки сообщения в доменном сообщении
                            _getResultMessageHandler.Success(messageDomain, result);
                        }
                        else
                        {
                            if (messageDomain.SendedDate.HasValue &&
                                DateTime.Now.Subtract(messageDomain.SendedDate.Value).Days > GET_RESULT_TIMEOUT_IN_DAYS)
                            {
                                //в течение таймаута не можем получить результат обработки сообщения, помечаем
                                _getResultMessageHandler.NoResultByTimeout(messageDomain);
                            }
                            else
                            {
                                //помечаем, что сообщение ещё не обработалось
                                _getResultMessageHandler.NotReady(messageDomain);
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        //обрабатываем исключения во время работы
                        _getResultMessageHandler.Fail(messageDomain, exception);
                    }
                }
                stopWatch.Stop();
                _logger.Info(this.GetType(), $"По {messages.Count} доменным сообщениям УК {coreInitData.UkId} получено " +
                             $"{messages.Count(x => x.Status == MessageStatus.Done)} успешных ответов, " +
                             $"{messages.Count(x => x.Status == MessageStatus.InProcess)} в обработке, " +
                             $"{messages.Count(x => x.Status == MessageStatus.ResponseTakingError)} упали с ошибкой, " +
                             $"{messages.Count(x => x.Status == MessageStatus.ResponseTakingErrorTryAgain)} будут отправлены повторно, за {stopWatch.Elapsed}");
            }
            catch (Exception ex)
            {
                _logger.Error(this.GetType(), $"Произошло исключение при обработке {coreInitData}", ex);
            }
        }