public static IQueryable<Pmta> GetPmtasByDeliveryGroup(IPmtaRepository pmtaRepository, DeliveryGroup deliveryGroup) { return (from dsi in pmtaRepository.GetDeliveryServerIps() where dsi.deliveryserver_id.HasValue && dsi.deliverygroup_id.HasValue && dsi.deliverygroup_id == deliveryGroup.deliverygroup_id join pmta in pmtaRepository.GetAll() on dsi.deliveryserver_id equals pmta.deliveryserver_id select pmta).Distinct(); }
public void FindAndCancelBulkingCampaigns( IPmtaRepository pmtaRepository, IDeliveryGroupRepository deliveryGroupRepository, IHeatDataRepository heatDataRepository, int heatDataLookBackMinutes, int minimumRecords, int minimumInboxing, DateTime nextReset ) { _logger.Info("Getting Heat Data"); var inboxing = heatDataRepository.GetCampaignInboxingStatistics(heatDataLookBackMinutes).ToArray(); _logger.Info("Getting DeliveryGroups"); var monitoredDeliveryGroups = DeliveryGroup.GetMonitored(deliveryGroupRepository).ToArray(); _logger.Info("Verifying Pmtas for Monitored DeliverGroups"); var deliveryServerIds = Pmta.GetDeliveryServerIdsForMonitoredDeliveryGroups(pmtaRepository, deliveryGroupRepository); var pmtas = pmtaRepository.GetAll(); var missingPmtas = deliveryServerIds.Where(d => !pmtas.Any(p => p.deliveryserver_id == d)); if (missingPmtas.Any()) { _logger.WarnFormat("Missing Pmtas for DeliveryServers {0}", string.Join(", ", missingPmtas)); return; } foreach (var deliveryGroup in monitoredDeliveryGroups) { try { var campaigns = inboxing.Where(c => c.Records >= minimumRecords && c.DeliveryGroups.Any(d => d.deliverygroup_id == deliveryGroup.deliverygroup_id)).ToArray(); if (campaigns.Any()) { var bulkingCampaignsStats = campaigns.Where(c => c.InboxingRate <= minimumInboxing).ToArray(); if (bulkingCampaignsStats.Count() == campaigns.Count()) { var dblogEvent = new Event() { EventName = Event.EventNames.AllBulked, DeliveryGroup = deliveryGroup, Monitor = Event.Monitors.CancelOnBulking, InboxingRateSetting = minimumInboxing }; bulkingCampaignsStats.Select(c => new EventCampaign() { Campaign = c.Campaign, InboxingRate = c.InboxingRate }) .ToList().ForEach(c => dblogEvent.EventCampaigns.Add(c)); _eventRepository.Add(dblogEvent); _logger.InfoFormat("Starting AllBulked on {0}", deliveryGroup.deliverygroup_id); _unitOfWork.SaveChanges(); PausePurgeAndCancelByDeliveryGroup(pmtaRepository, nextReset, deliveryGroup, dblogEvent); _emailNotification.SendEvent(dblogEvent); } else if (bulkingCampaignsStats.Any()) { var dblogEvent = new Event() { EventName = Event.EventNames.SomeBulked, DeliveryGroup = deliveryGroup, Monitor = Event.Monitors.CancelOnBulking, InboxingRateSetting = minimumInboxing }; bulkingCampaignsStats.Select(c => new EventCampaign() { Campaign = c.Campaign, InboxingRate = c.InboxingRate }) .ToList().ForEach(c => dblogEvent.EventCampaigns.Add(c)); _eventRepository.Add(dblogEvent); _logger.InfoFormat("Starting SomeBulked on {0}", deliveryGroup.deliverygroup_id); _unitOfWork.SaveChanges(); foreach (var campaignStats in bulkingCampaignsStats) { if (campaignStats.Campaign.Template.creative_id.HasValue) { PurgeAndCancelByCampaignContent(pmtaRepository, nextReset, campaignStats, deliveryGroupRepository, dblogEvent); } } _emailNotification.SendEvent(dblogEvent); } } } catch (Exception ex) { _logger.ErrorFormat("DVG {0}: {1}", deliveryGroup.deliverygroup_id, ex.UnwrapForLog(true)); } } }
private void PausePurgeAndCancelByDeliveryGroup(IPmtaRepository pmtaRepository, DateTime nextReset, DeliveryGroup deliveryGroup, Event dblogEvent) { foreach (var deliveryServer in Pmta.GetVmtasGroupedByDeliveryServerForDeliveryGroup(pmtaRepository, deliveryGroup)) { try { var pmta = pmtaRepository.GetAll().FirstOrDefault(p => p.deliveryserver_id == deliveryServer.Key); if (pmta != null) { var queues = _mtaAgent.GetHotmailQueuesByVmta(pmta.ToMta(), deliveryServer.Select(d => d.VmtaUrl)); foreach (var queue in queues) { try { _mtaAgent.Pause(pmta.ToMta(), queue); _logger.DebugFormat("Paused Queue {0} on {1}", queue, pmta.Host); dblogEvent.EventActions.Add(new EventAction() { Action = EventAction.Actions.MTAPause, ActedOnDeliveryGroupId = deliveryGroup.deliverygroup_id, Pmta = pmta, PmtaQueue = queue }); _mtaAgent.Purge(pmta.ToMta(), queue); _logger.DebugFormat("Deleted Queue {0} on {1}", queue, pmta.Host); dblogEvent.EventActions.Add(new EventAction() { Action = EventAction.Actions.MTAPurge, ActedOnDeliveryGroupId = deliveryGroup.deliverygroup_id, Pmta = pmta, PmtaQueue = queue }); } catch (Exception ex) { _logger.ErrorFormat("Pmta {0}: {1}", pmta.PmtaId, ex.UnwrapForLog(true)); } } } else { _logger.ErrorFormat("Missing MTA credentials for {0}", deliveryServer.Key); } } catch (Exception ex) { _logger.ErrorFormat("DeliveryGroup {0} DeliveryServer {1}: {2}", deliveryGroup.deliverygroup_id, deliveryServer.Key, ex.UnwrapForLog(true)); } } _unitOfWork.SaveChanges(); DeliveryGroup.CancelHotmailJobsByDeliveryGroup(_jobRepository, _logger, deliveryGroup, nextReset, dblogEvent); _unitOfWork.SaveChanges(); }
public static IQueryable<Pmta> GetMonitored(IPmtaRepository pmtaRepository) { return pmtaRepository.GetAll().Where(p => p.IsActive); }