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