public List <TMessageDomain> GetMessageDomainsForSend(CoreInitData coreInitData) { var notSendedStatuses = new List <MessageStatus>() { MessageStatus.New, MessageStatus.SendErrorTryAgain }; return(_messageRepository.Table.Where(x => x.UkId == coreInitData.UkId && notSendedStatuses.Contains(x.Status) && !x.ResponseGuid.HasValue).ToList()); }
public List <TMessageDomain> GetMessageDomainsForGetResults(CoreInitData coreInitData) { var inProcessStatuses = new List <MessageStatus>() { MessageStatus.Sent, MessageStatus.InProcess, MessageStatus.Received, MessageStatus.ResponseTakingErrorTryAgain }; return(_messageRepository.Table.Where(x => x.UkId == coreInitData.UkId && (inProcessStatuses.Contains(x.Status) || (x.Status == MessageStatus.New && x.ResponseGuid.HasValue))).ToList()); }
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); } }