Beispiel #1
0
        public void CatchWarningFormalizeExceptionTest()
        {
            var priceItemId        = CatchWarningFormalizeExceptionTestPrepareData();
            var priceProcessItem   = new PriceProcessItem(false, 0, null, priceItemId, @"Data\781.dbf", null);
            var priceProcessThread = new PriceProcessThread(priceProcessItem, String.Empty, false);
            var outPriceFileName   = Path.Combine(Settings.Default.BasePath, priceProcessItem.PriceItemId + Path.GetExtension(priceProcessItem.FilePath));

            Common.Tools.FileHelper.InitDir(Settings.Default.BasePath);
            FlushAndCommit();
            priceProcessThread.ThreadWork();
            Assert.False(String.IsNullOrEmpty(priceProcessThread.CurrentErrorMessage), "Отсутствует информация о произошедшем исключении");
            Assert.True(priceProcessThread.FormalizeOK, "Формализация закончилась с ошибкой");

            var logs = Inforoom.PriceProcessor.Models.FormLog.Queryable
                       .Where(l => l.PriceItemId == priceItemId &&
                              l.ResultId == (int?)FormResults.Error)
                       .ToList();

            Assert.That(logs.Implode(x => x.Addition), Does.Contain("Прайс отключен по причине : FirmStatus"),
                        "Информация о предупреждении отсутствует в БД");
            //Проверяем, что копирование файла прошло успешно
            Assert.IsTrue(File.Exists(outPriceFileName));
        }
        /// <summary>
        /// удаляем нитку с формализацией
        /// </summary>
        /// <param name="p"></param>
        private void DeleteProcessThread(PriceProcessThread p)
        {
            _logger.InfoFormat("Удаляем нитку {0}: IsAlive = {1}   ThreadState = {2}  FormalizeEnd = {3}  ProcessState = {4}", p.TID, p.ThreadIsAlive, p.ThreadState, p.FormalizeEnd, p.ProcessState);
            //при перезапуске обработчика мы очищаем _errorMessages (хз зачем это нужно но пусть так)
            //в этом случае мы получим null reference
            //по этому и обвязка
            var hi = (FileHashItem)_errorMessages[p.ProcessItem.FilePath];

            if (hi != null)
            {
                hi.ErrorMessage = p.CurrentErrorMessage;
            }

            //если формализация завершилась успешно
            if (p.FormalizeOK)
            {
                try {
                    //устанавливаем время последней удачной формализации
                    _lastFormalizationDate = DateTime.UtcNow;
                    _formalizationFail     = false;
                    //удаляем файл
                    global::Common.Tools.FileHelper.FileDelete(p.ProcessItem.FilePath);
                    //удаляем информацию о последних ошибках
                    _errorMessages.Remove(p.ProcessItem.FilePath);
                    //удаляем из списка на обработку
                    PriceItemList.list.Remove(p.ProcessItem);
                }
                catch (Exception e) {
                    _logger.ErrorFormat("Не получилось удалить файл {0} после успешной формализации\r\n{1}", p.ProcessItem.FilePath, e);
                }
            }
            //если элемента в списке не существует, то значит он был удален как дублирующийся, то просто удаляем оставшийся файл
            else if (!PriceItemList.list.Contains(p.ProcessItem))
            {
                try {
                    //удаляем файл
                    global::Common.Tools.FileHelper.FileDelete(p.ProcessItem.FilePath);
                    //удаляем информацию о последних ошибках
                    _errorMessages.Remove(p.ProcessItem.FilePath);
                }
                catch (Exception e) {
                    _logger.ErrorFormat("Не получилось удалить файл {0} после останова дублирующейся нитки\r\n{1}", p.ProcessItem.FilePath, e);
                }
            }
            else
            {
                if (hi != null)
                {
                    hi.ErrorCount++;
                }
                //Если превысили лимит ошибок, то удаляем его из списка, помещаем в ErrorFilesPath
                //и отправляем уведомление
                if (hi != null && hi.ErrorCount > Settings.Default.MaxErrorCount)
                {
                    _logger.InfoFormat("Удаляем файл из-за большого кол-ва ошибок: FileName:{0} ErrorCount:{1} Downloaded:{2} ErrorMessage:{3} PriceItemId:{4}", p.ProcessItem.FilePath, hi.ErrorCount, p.ProcessItem.Downloaded, hi.ErrorMessage, p.ProcessItem.PriceItemId);
                    try {
                        PriceItemList.list.Remove(p.ProcessItem);
                    }
                    catch (Exception e) {
                        _logger.ErrorFormat("Не удалось удалить файл из списка {0}\r\n{1}", p.ProcessItem.FilePath, e);
                    }
                    try {
                        var file = Path.Combine(Settings.Default.ErrorFilesPath, Path.GetFileName(p.ProcessItem.FilePath));
                        if (File.Exists(file))
                        {
                            File.Delete(file);
                        }
                        File.Move(p.ProcessItem.FilePath, file);
                    }
                    catch (Exception e) {
                        _logger.ErrorFormat("Не удалось переместить файл {0} в каталог {1}\r\n{2}", p.ProcessItem.FilePath, Settings.Default.ErrorFilesPath, e);
                    }
                    Mailer.SendToWarningList("Ошибка формализации",
                                             String.Format(Settings.Default.MaxErrorsError,
                                                           p.ProcessItem.FilePath,
                                                           Settings.Default.ErrorFilesPath,
                                                           Settings.Default.MaxErrorCount));

                    _errorMessages.Remove(p.ProcessItem.FilePath);
                }
                else
                {
                    try {
                        PriceItemList.list.Remove(p.ProcessItem);
                        PriceItemList.list.Add(p.ProcessItem);
                    }
                    catch (Exception e) {
                        _logger.ErrorFormat("Не удалось переместить файл в конец списка {0}\r\n{1}", p.ProcessItem.FilePath, e);
                    }
                }
            }
        }