Exemplo n.º 1
0
        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}");
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <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);
            }
        }