/// <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); }
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); } }
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); } }