bool ReliableRecordStatus(ref MailTracking tracking, string rawAuthTicketData, Recipient[] recipients, PartialCreateStatus partial, MailTrackingStatus unrecordedStatus, string unrecordedNote,bool reSubmit ) { try { tracking.Status = unrecordedStatus; tracking = ExecuteDbActionsWithinTransaction(tracking, (cn, t, l) => { return PerformMailTrackingUpdate(cn, t, unrecordedNote); }); return true; } catch (SqlException e) { if (e.Message.Contains("A network-related or instance-specific error occurred while establishing a connection to SQL Server")) { YPMon.Critical("SQLSERVER_UNREACHABLE", e.FormatForLogging(), null); var capture = tracking; string server = (string.IsNullOrEmpty(e.Server)) ? string.Empty : e.Server; YPMon.Info("TMAIL_RELIABLERECORDSTATUS_INSERTRACKING_SQLERROR", string.Format("App: {0}, Env: {1}, Template: {2}, States: {3} SQLERROR: {4} SQLServer: {5}", capture.Application, capture.Environment, capture.EmailTemplate, Enum.GetName(typeof(PartialCreateStatus), partial), e.Message,server)); if (partial == PartialCreateStatus.Paused) { //_output.CreateAndSendMessage<PausedMailingMessage>(AgentProtocol.CTMailPaused, m => //{ // m.AuthTicket = rawAuthTicketData; // m.MailTrackingID = capture.ID; // m.Application = capture.Application; // m.Environment = capture.Environment; // m.Template = capture.EmailTemplate; // m.Recipients = recipients; // m.PartialStatus = partial; // m.UnrecordedStatus = unrecordedStatus; // m.UnrecordedNote = unrecordedNote; //}); } if (partial != PartialCreateStatus.Dropped) { _output.CreateAndSendMessage<DelayedMailingMessage>(AgentProtocol.CTMailDelayed, m => { m.AuthTicket = rawAuthTicketData; m.MailTrackingID = capture.ID; m.Application = capture.Application; m.Environment = capture.Environment; m.Template = capture.EmailTemplate; m.Recipients = recipients; m.PartialStatus = partial; m.UnrecordedStatus = unrecordedStatus; m.UnrecordedNote = unrecordedNote; }); } YPMon.Info("TMAIL_RECORDMAILING_STATUS", string.Format("SQLSERVER_UNREACHABLE App: {0}, Env: {1}, Template: {2}, States: {3}", capture.Application, capture.Environment, capture.EmailTemplate, Enum.GetName(typeof(PartialCreateStatus), partial))); } return false; } }
internal void PerformMailingLogic(Guid id, string app, string env, string template, Recipient[] recipients, PartialCreateStatus partial, string rawAuthTicketData, MailTrackingStatus unrecordedStatus, string unrecordedNote) { Require.IsNotEmpty("app", app); Require.IsNotEmpty("env", env); Require.IsNotEmpty("template", template); Require.IsNotNull("recipients", recipients); Require.AtLeastOneParam("recipients", recipients); MailTracking tracking = null; while (true) { if (tracking == null && partial >= PartialCreateStatus.Saved) { YPMon.Info("TMAIL_PERFORM_SM", string.Format("App: {0}, Env: {1}, Template: {2}, States: {3}", app,env,template,partial.ToString())); this.TraceInformation("Processing mailing logic for App: {0}, Env: {1}, Template: {2}, State: {3}", app, env, template, partial.ToString()); if (!TryLoadTracking(id, out tracking)) { // could not load, requeue and try again later... YPMon.Info("TMAIL_PERFORM_SM", string.Format("CANNOT LOAD TRACKING App: {0}, Env: {1}, Template: {2}, States: {3}", app, env, template, partial.ToString())); this.TraceError("Cannot load tracking for App: {0}, Env: {1}, Template: {2}, State: {3}", app, env, template, Enum.GetName(typeof(PartialCreateStatus), tracking.Status)); //if (partial == PartialCreateStatus.Paused) //{ // Agent.CreateAndSendMessage<PausedMailingMessage>(AgentProtocol.CTMailPaused, m => // { // m.AuthTicket = rawAuthTicketData; // m.MailTrackingID = id; // m.Application = app; // m.Environment = env; // m.Template = template; // m.Recipients = recipients; // m.PartialStatus = partial; // }); //} //else //{ //PAUSED mailing and deay mailing will retry now. Agent.CreateAndSendMessage<DelayedMailingMessage>(AgentProtocol.CTMailDelayed, m => { m.AuthTicket = rawAuthTicketData; m.MailTrackingID = id; m.Application = app; m.Environment = env; m.Template = template; m.Recipients = recipients; m.PartialStatus = partial; }); //} return; } if (unrecordedStatus != MailTrackingStatus.None && !String.IsNullOrEmpty(unrecordedNote)) { // Record the unrecorded message if (!ReliableRecordStatus(ref tracking, rawAuthTicketData, recipients, partial, unrecordedStatus, unrecordedNote)) return; } } switch (partial) { case PartialCreateStatus.None: // 1) Save the tracking record... tracking = Factory<MailTracking>.CreateInstance(); tracking.ID = id; tracking.Application = app; tracking.Environment = env; tracking.EmailTemplate = template; tracking.Status = MailTrackingStatus.None; YPMon.Info("TMAIL_PERFORM_SM", string.Format("App: {0}, Env: {1}, Template: {2}, States: {3}", app, env, template, Enum.GetName(typeof(PartialCreateStatus), tracking.Status))); this.TraceInformation("Saving tracking record for App: {0}, Env: {1}, Template: {2}, States: {3}", app, env, template, Enum.GetName(typeof(PartialCreateStatus), tracking.Status)); if (TrySaveMailing(ref tracking, rawAuthTicketData, ref partial, recipients)) { continue; } return; case PartialCreateStatus.Dropped: YPMon.Info("TMAIL_PERFORM_SM", string.Format("App: {0}, Env: {1}, Template: {2}, States: {3}", app, env, template, Enum.GetName(typeof(PartialCreateStatus), partial))); //if (ReliableRecordStatus(ref tracking, rawAuthTicketData, recipients, partial, MailTrackingStatus.Dropped, // String.Concat("Email message has invalid states or irrecoverable error: dropped ", app, "/", env, "."),false)) //{ // continue; //} return; case PartialCreateStatus.Saved: // 2) validate app and environment... try { ValidateApplicationAndEnvironment(app, env); partial = PartialCreateStatus.Validated; YPMon.Info("TMAIL_PERFORM_SM", string.Format("App: {0}, Env: {1}, Template: {2}, States: {3}", app, env, template, Enum.GetName(typeof(PartialCreateStatus), partial))); if (ReliableRecordStatus(ref tracking, rawAuthTicketData, recipients, partial, MailTrackingStatus.Accepted, String.Concat("Application and environment accepted: ", app, "/", env, "."))) { continue; } } catch (ResourceNotFoundException e) { ReliableRecordStatus(ref tracking, rawAuthTicketData, recipients, PartialCreateStatus.Failed, MailTrackingStatus.Failed, e.Message); } return; case PartialCreateStatus.Validated: // 3) record the email addresses partial = PartialCreateStatus.EmailsRecorded; YPMon.Info("TMAIL_PERFORM_SM", string.Format("App: {0}, Env: {1}, Template: {2}, States: {3}", app, env, template, Enum.GetName(typeof(PartialCreateStatus), partial))); if (ReliableRecordStatus(ref tracking, rawAuthTicketData, recipients, partial, MailTrackingStatus.Accepted, String.Concat("Email recipients: ", recipients.ToStrongMailEmailAddressStream()))) { continue; } return; case PartialCreateStatus.EmailsRecorded: // 4) Submit to StrongMail... YPMon.Info("TMAIL_PERFORM_SM", string.Format("App: {0}, Env: {1}, Template: {2}, States: {3} PreSubmit", app, env, template, Enum.GetName(typeof(PartialCreateStatus), partial))); TrySubmitMailing(tracking, rawAuthTicketData, recipients, ref partial); YPMon.Info("TMAIL_PERFORM_SM", string.Format("App: {0}, Env: {1}, Template: {2}, States: {3} PostSubmit", app, env, template, Enum.GetName(typeof(PartialCreateStatus), partial))); return; default: break; } } }
bool ReliableRecordStatus(ref MailTracking tracking, string rawAuthTicketData, Recipient[] recipients, PartialCreateStatus partial, MailTrackingStatus unrecordedStatus, string unrecordedNote ) { return ReliableRecordStatus(ref tracking, rawAuthTicketData, recipients, partial, unrecordedStatus, unrecordedNote, true); }