private static void Main(string[] args) { if (!ErrorMessages()) { var lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(SyncLogItem), SyncLogItem.Views.SyncLogItemE); lcs.LimitFunction = FunctionBuilder.BuildAnd( FunctionBuilder.BuildEquals <SyncLogItem>(x => x.Status, tSyncStatus.Prepared), FunctionBuilder.BuildEquals <SyncLogItem>(x => x.Direction, tSyncDirection.Out)); List <SyncLogItem> synclogitems = null; try { synclogitems = ds.LoadObjects(lcs).Cast <SyncLogItem>().OrderBy(x => x.Created).ToList(); } catch (Exception ex) { LogService.LogError($"{MessageErrorHeader}Произошла ошибка при попытке вычитать SyncLogItem из БД!{Environment.NewLine}{ex}"); } if (synclogitems != null && synclogitems.Count > 0) { var sliForUpdate = new List <SyncLogItem>(); foreach (var synclogitem in synclogitems) { try { // Проверка валидация по XSD-схеме полученного xml. if (Context.EnableXSDValidation) { var pathToXSD = Path.Combine($"{Context.XSDSchemasPath}{synclogitem.Description}.xsd"); if (File.Exists(pathToXSD)) { XMLTools.CheckXMLtoXSD(synclogitem.DataSet, pathToXSD); } else { LogService.LogWarn( $"BusSenderService: При отправке сообщений включена проверка валидности сообщения XSD-схеме, но XSD-схема для сообщения типа {synclogitem.Description} не найдена!{Environment.NewLine} Путь для ожидаемой XSD-схемы - {pathToXSD}"); } } // Отправка сообщения. SBSenderHelper.SendMessageToESB(synclogitem.Description, synclogitem.DataSet); synclogitem.Status = synclogitem.RequestInfo != null ? tSyncStatus.RespWaiting : tSyncStatus.Success; LogService.LogInfo($"{MessageErrorHeader} Успешно отправлен в шину SyncLogItem: pk - {synclogitem.__PrimaryKey}. Время отправки - {DateTime.Now:dd.MM.yyyy HH:mm:ss}."); sliForUpdate.Add(synclogitem); } catch (Exception ex) { LogService.Log.Error($"{MessageErrorHeader}Возникла ошибка при попытке отправить в шину SyncLogItem: pk - {synclogitem.__PrimaryKey}, дата создания - {synclogitem.CreateTime?.ToString("dd.MM.yyyy HH:mm:ss") ?? ""}, статус - {synclogitem.Status}. Время отправки - {DateTime.Now:dd.MM.yyyy HH:mm:ss}{Environment.NewLine}{ex}."); var time = ConfigurationManager.AppSettings["Time"]; if (synclogitem.Created != null && DateTime.Now.Subtract(synclogitem.Created.Value).TotalSeconds > int.Parse(time)) { synclogitem.Status = tSyncStatus.Invalid; sliForUpdate.Add(synclogitem); } break; } } try { var objForUpdate = sliForUpdate.Cast <DataObject>().ToArray(); ds.UpdateObjects(ref objForUpdate); } catch (Exception ex) { var errorUpdateMessage = string.Join(",", sliForUpdate.Select(x => $"pk:{x.__PrimaryKey} - статус:{x.Status}")); LogService.LogError($"{MessageErrorHeader}Произошла ошибка при попытке обновить статусы сообщений!{Environment.NewLine}{ex}{Environment.NewLine}{errorUpdateMessage}"); } } } }
/// <summary> /// Принять сообщение из шины. /// </summary> /// <param name="message">Сообщение.</param> public void AcceptMessage([MessageParameter(Name = "msg")] MessageFromESB message) { LogService.LogInfo($"BusListenerService: Принял соообщение - {message.MessageTypeID}!"); // Ищем в конфиг файле, привязку между типов сообщения и xml-классом этого сообщения. var xmlClassName = Context.GetMessageXMLClassNameByMessageID(message.MessageTypeID); if (!string.IsNullOrEmpty(xmlClassName)) { // Получаем тип по названию класса из конфиг файла. var messageType = Type.GetType(xmlClassName); if (messageType != null) { try { ICommonMessage messageObj = null; if (!string.IsNullOrEmpty(message.Body)) { // Проверка валидация по XSD-схеме полученного xml. if (Context.EnableXSDValidation) { var pathToXSD = Path.Combine(HttpRuntime.AppDomainAppPath, $"{Context.XSDSchemasPath}{message.MessageTypeID}.xsd"); XMLTools.CheckXMLtoXSD(message.Body, pathToXSD); } // Десериализуем сообщение для его сохранения. messageObj = SerializationTools.DeserialiseDataContract(messageType, message.Body) as ICommonMessage; } if (messageObj != null) { // Сохранение сообщения в SyncLogItem. messageObj.Save(message.SenderName, message.Body, true); } else { LogService.LogWarn( $"BusListenerService: Получено пустое сообщение типа {message.MessageTypeID}. Сообщение не будет сохранено в БД!"); } } catch (XSDExistenceException ex) { LogService.LogWarn($"BusListenerService: При получении сообщения включена проверка валидности сообщения XSD-схеме, " + $"но XSD-схема для сообщения типа {message.MessageTypeID} не найдена!{Environment.NewLine} {ex.Message}"); throw; } catch (XmlSchemaValidationException ex) { LogService.LogError( $"{MessageErrorHeader} Не пройдена валидация XSD-схемы для сообщения типа {message.MessageTypeID}", ex); throw; } catch (Exception ex) { LogService.LogError($"{MessageErrorHeader}", ex); throw; } } else { var errorMessage = $"{MessageErrorHeader} Не найден XML-класс типа сообщения с названием {xmlClassName}"; LogService.LogError(errorMessage); throw new InvalidOperationException(errorMessage); } } else { var errorMessage = $"{MessageErrorHeader} Неизвестный тип сообщения - {message.MessageTypeID}. Проверьте настройки секции {Context.CustomSBListenerConfigSectionName} в конфигурационном файле."; LogService.LogError(errorMessage); throw new UnknowMessageTypeException(errorMessage); } }