/// <summary> /// Archiviazione dei file generati dalla ProcessFolder. /// Questa funzione racchiude tutte le funzioni di archiviazione su storage della mail (Biblos e DocSuite) /// I file vengono salvati in Biblos secondo la gerarchia indicata nel file ..._index.xml /// Genera il record PecMail e tutte i record di supporto per i file contenuti nella Pec (postacert.eml, daticert.xml, ecc...) /// Genera i record per PecMailAttachments /// </summary> public SortedList <short, StatisticLog> ArchiveFiles(SortedList <short, StatisticLog> statistics) { FileLogger.Info(_loggerName, "Avvio archiviazione mail elaborate"); PECMail pecMail = null; int nRetry = MaxRetry; String errMsg = string.Empty; int waitingTime = 30000; try { String[] files = MailInfo.GetInfoFiles(_parameters.DropFolder); DateTime start, end; foreach (String filename in files) { start = DateTime.Now; try { if (_cancelRequest()) { FileLogger.Info(_loggerName, "Chiusura modulo invocata dall'utente."); return(statistics); } nRetry = MaxRetry; errMsg = string.Empty; waitingTime = 30000; IterationTracker iterationTracker = new IterationTracker(); while (--nRetry > 0) { IterationDescriptor currentIterationInfo = iterationTracker.AddIteration(); if (_storeFacade.ArchiveMail(_parameters.DropFolder, filename, _parameters.DebugModeEnabled, true, out pecMail, out errMsg, currentIterationInfo)) { FileLogger.Info(_loggerName, $"Archiviazione di MailInfo [{filename}] avvenuta con successo, passaggio ad elemento successivo."); if (pecMail?.MailBox != null && statistics?.Keys != null && statistics.Keys.Any(f => f == pecMail.MailBox.Id)) { statistics[pecMail.MailBox.Id].PECDone++; } break; } FileLogger.Warn(_loggerName, $"E' avvenuto un errore di archiviazione, potenzialmente temporaneo. Verrà ritentata l'archiviazione altre {nRetry} volte dopo una pausa di {waitingTime / 1000} sec."); //Errore di archiviazione, attendo 150 secondi diviso il tentativo prima di riprovare if (nRetry > 0) { #if !DEBUG System.Threading.Thread.Sleep(waitingTime); #endif waitingTime += waitingTime / nRetry; } } iterationTracker.Log(_loggerName); // Se mi trovo qui significa che ho esaurito i tentativi di archiviazione if (nRetry <= 0) { String errorMessage = $"{errMsg} - Eseguiti {MaxRetry} tentativi di archiviazione senza successo."; if (pecMail != null && pecMail.Id > 0) { String errorResult = $"La PEC {pecMail.Id} non è stata correttamente inserita ed è stata disattivata (isActive = 255) e dovrà essere riattivata previa verifica dell'errore. {errorMessage}"; pecMail.IsActive = ActiveType.Cast(ActiveType.PECMailActiveType.Error); try { MailStoreFacade.Factory.PECMailFacade.UpdateOnly(ref pecMail); MailStoreFacade.Factory.PECMailLogFacade.Error(ref pecMail, errorResult); if (pecMail != null && pecMail.MailBox != null && statistics != null && statistics.Keys != null && statistics.Keys.Any(f => f == pecMail.MailBox.Id)) { statistics[pecMail.MailBox.Id].PECError++; } } catch (Exception ex) { errorMessage = string.Concat(errorMessage, "\n", ex.Message); } } //throw new ApplicationException(errorMessage); } end = DateTime.Now; if (pecMail?.MailBox != null && statistics?.Keys != null && statistics.Keys.Any(f => f == pecMail.MailBox.Id)) { statistics[pecMail.MailBox.Id].ElaboratedTime = statistics[pecMail.MailBox.Id].ElaboratedTime + (TimeSpan.FromTicks(end.Ticks) - TimeSpan.FromTicks(start.Ticks)); } } catch (Exception ex_int) { if (pecMail != null && pecMail.Id > 0) { try { PECMailBox box = MailStoreFacade.Factory.PECMailboxFacade.GetById(pecMail.MailBox.Id); MailStoreFacade.Factory.PECMailboxLogFacade.InsertLog(ref box, "ERRORE - Archiviazione mail", PECMailBoxLogFacade.PecMailBoxLogType.ErrorEval); end = DateTime.Now; if (pecMail != null && pecMail.MailBox != null && statistics != null && statistics.Keys != null && statistics.Keys.Any(f => f == pecMail.MailBox.Id)) { statistics[pecMail.MailBox.Id].ElaboratedTime = statistics[pecMail.MailBox.Id].ElaboratedTime + (TimeSpan.FromTicks(end.Ticks) - TimeSpan.FromTicks(start.Ticks)); statistics[pecMail.MailBox.Id].PECError++; } } catch (Exception ex_log) { FileLogger.Error(_loggerName, string.Format("Errore in archiviazione mail {0} -> logger. Il flusso normale proseguirà con le successive mail.", filename), ex_log); _sendMessage(string.Format("Errore in archiviazione mail -> logger. Il flusso normale proseguirà con le successive mail.{0}Exception: {1}{0}Stacktrace: {2}", Environment.NewLine, ex_log.Message, _fullStacktrace(ex_log))); } } FileLogger.Error(_loggerName, string.Format("Errore in archiviazione mail {0}. Il flusso normale proseguirà con le successive mail.", filename), ex_int); _sendMessage(string.Format("Errore in archiviazione mail. Il flusso normale proseguirà con le successive mail.{0}Exception: {1}{0}Stacktrace: {2}", Environment.NewLine, ex_int.Message, _fullStacktrace(ex_int))); } } } catch (Exception ex) { FileLogger.Error(_loggerName, "Errore in archiviazione globale mail.", ex); _sendMessage(string.Format("Errore in archiviazione globale mail.{0}Exception: {1}{0}Stacktrace: {2}", Environment.NewLine, ex.Message, _fullStacktrace(ex))); } FileLogger.Info(_loggerName, "Fine archiviazione mail scaricate e processate"); return(statistics); }
/// <summary> /// Archiviazione dei file generati dalla ProcessFolder. /// Questa funzione racchiude tutte le funzioni di archiviazione su storage della mail (Biblos e DocSuite) /// I file vengono salvati in Biblos secondo la gerarchia indicata nel file ..._index.xml /// Genera il record PecMail e tutte i record di supporto per i file contenuti nella Pec (postacert.eml, daticert.xml, ecc...) /// Genera i record per PecMailAttachments /// </summary> public void ArchiveFiles() { FileLogger.Info(_loggerName, "Avvio archiviazione mail elaborate"); PECMail pecMail = null; int nRetry = MaxRetry; String errMsg = string.Empty; int waitingTime = 30000; try { String[] files = MailInfo.GetInfoFiles(_parameters.DropFolder); foreach (String filename in files) { try { if (_cancelRequest()) { FileLogger.Info(_loggerName, "Chiusura modulo invocata dall'utente."); return; } nRetry = MaxRetry; errMsg = string.Empty; waitingTime = 30000; IterationTracker iterationTracker = new IterationTracker(); while (--nRetry > 0) { IterationDescriptor currentIterationInfo = iterationTracker.AddIteration(); if (_storeFacade.ArchiveMail(_parameters.DropFolder, filename, _parameters.DebugModeEnabled, true, out pecMail, out errMsg, currentIterationInfo)) { FileLogger.Info(_loggerName, string.Format("Archiviazione di MailInfo [{0}] avvenuta con successo, passaggio ad elemento successivo.", filename)); break; } FileLogger.Warn(_loggerName, string.Format("E' avvenuto un errore di archiviazione, potenzialmente temporaneo. Verrà ritentata l'archiviazione altre {0} volte dopo una pausa di {1} sec.", nRetry, waitingTime / 1000)); //Errore di archiviazione, attendo 150 secondi diviso il tentativo prima di riprovare if (nRetry > 0) { #if !DEBUG Thread.Sleep(waitingTime); #endif waitingTime += waitingTime / nRetry; } } iterationTracker.Log(_loggerName); // Se mi trovo qui significa che ho esaurito i tentativi di archiviazione if (nRetry <= 0) { String errorMessage = string.Format("{0} - Eseguiti {1} tentativi di archiviazione senza successo.", errMsg, MaxRetry); if (pecMail != null) { String errorResult = string.Format("La PEC {0} non è stata correttamente inserita ed è stata disattivata (isActive = 255) e dovrà essere riattivata previa verifica dell'errore. {1}", pecMail.Id, errorMessage); pecMail.IsActive = ActiveType.Cast(ActiveType.PECMailActiveType.Error); try { MailStoreFacade.Factory.PECMailFacade.UpdateOnly(ref pecMail); MailStoreFacade.Factory.PECMailLogFacade.Error(ref pecMail, errorResult); } catch (Exception ex) { errorMessage = string.Concat(errorMessage, "\n", ex.Message); } } //throw new ApplicationException(errorMessage); } } catch (Exception ex_int) { FileLogger.Error(_loggerName, string.Format("Errore in archiviazione mail {0}. Il flusso normale proseguirà con le successive mail.", filename), ex_int); _sendMessage(string.Format("Errore in archiviazione mail. Il flusso normale proseguirà con le successive mail.{0}Exception: {1}{0}Stacktrace: {2}", Environment.NewLine, ex_int.Message, _fullStacktrace(ex_int))); } } } catch (Exception ex) { FileLogger.Error(_loggerName, "Errore in archiviazione globale mail.", ex); _sendMessage(string.Format("Errore in archiviazione globale mail.{0}Exception: {1}{0}Stacktrace: {2}", Environment.NewLine, ex.Message, _fullStacktrace(ex))); } FileLogger.Info(_loggerName, "Fine archiviazione mail scaricate e processate"); }