public static void AddEvent(MailjetEvent mailjetEvent) { Task.Run(() => { Thread.CurrentThread.Name = "AddEventWork"; ProcessEvent(mailjetEvent); }); }
static void TryResaveEvent(MailjetEvent unsavedEvent) { Thread.CurrentThread.Name = "ResaveEventWork"; //Попытка пересохранения каждые 20 сек. Thread.Sleep(20000); ProcessEvent(unsavedEvent); }
public void PostEvent(MailjetEvent content) { EmailManager.AddEvent(content); //Необходимо обязательно отправлять в ответ http code 200 - OK WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK; }
static void ResaveEventWork() { Thread.CurrentThread.Name = "ResaveEventWorkStarter"; while (true) { MailjetEvent unsavedEvent = unsavedEventsQueue.Take(); logger.Debug("{1} Взято не сохраненное событие из очереди для попытки пересохранения. Оставшееся кол-во событий в очереди: {0}", unsavedEventsQueue.Count, GetThreadInfo()); Task.Run(() => TryResaveEvent(unsavedEvent)); } }
static void ProcessEvent(MailjetEvent mailjetEvent) { if (mailjetEvent.AttemptCount > 0) { logger.Debug("{1} Повторная обработка события с сервера Mailjet. Попытка {2}/{3} \n{0}", mailjetEvent, GetThreadInfo(), mailjetEvent.AttemptCount, MaxSendAttemptsCount); } else { logger.Debug("{1} Обработка события с сервера Mailjet \n{0}", mailjetEvent, GetThreadInfo()); } //Запись информации о письме в базу using (var uow = UnitOfWorkFactory.CreateWithoutRoot($"[ES]Обработка события Mailjet")) { var emailAction = emailRepository.GetStoredEmailByMessageId(uow, mailjetEvent.MessageID.ToString()); if (emailAction == null) { int mailId; if (int.TryParse(mailjetEvent.CustomID, out mailId)) { emailAction = uow.GetById <StoredEmail>(mailId); } } if (emailAction != null) { var eventDate = UnixTimeStampToDateTime(mailjetEvent.Time); if (eventDate > emailAction.StateChangeDate) { emailAction.StateChangeDate = eventDate; switch (mailjetEvent.Event) { case "sent": emailAction.State = StoredEmailStates.Delivered; break; case "open": emailAction.State = StoredEmailStates.Opened; break; case "spam": emailAction.State = StoredEmailStates.MarkedAsSpam; break; case "bounce": case "blocked": emailAction.State = StoredEmailStates.Undelivered; emailAction.AddDescription(mailjetEvent.GetErrorInfo()); break; } try { uow.Save(emailAction); uow.Commit(); } catch (Exception ex) { mailjetEvent.AttemptCount++; if (mailjetEvent.AttemptCount <= MaxEventSaveAttemptsCount) { unsavedEventsQueue.Add(mailjetEvent); } logger.Error("{1} Произошла ошибка при сохранении: {0}", ex.Message, GetThreadInfo()); } } } else { logger.Error("{0} Событие проигнорировано. Не найдено письмо в БД связанное с событием с сервера Mailjet.", GetThreadInfo()); } } }