Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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");
        }