예제 #1
0
        static void SendCycle <TSenderProvider, TMessage>
            (BatchSendingManager manager, IQueryable <TMessage> allPendingMsgs, IEnumerator <TSenderProvider> providers, IMessageSender <TSenderProvider, TMessage> MessageSender)
            where TSenderProvider : ISendServiceProvider
            where TMessage : IMessage
        {
            int allPendingCount = allPendingMsgs.Count();

            if (allPendingCount == 0)
            {
                return;
            }
            IEnumerable <TMessage> pendingChunk = null;
            int Counter = 0;

            while (providers.MoveNext())
            {
                var provider = providers.Current;
                pendingChunk = manager.MakeCountAcceptableByProvider(allPendingMsgs, provider);
                int getted = pendingChunk == null ? 0 : pendingChunk.Count();
                if (getted > 0)
                {
                    DateTime start = DateTime.Now;
                    MessageSender.SendBatch(pendingChunk, provider);
                    manager.StoreSendProviderWorkHistory(provider, start, DateTime.Now.AddMilliseconds(1), getted);
                    manager.Logic.DeleteLazy(pendingChunk.Cast <tblMessage>().Select(x => x.tblPendingMessagesQueue));
                    //UPDATE DB AFTER StoreSendProviderWorkHistory somehow:
                    manager.Logic.SaveChanges();
                    Counter += getted;
                }
                if (allPendingCount == Counter)
                {
                    break;
                }
            }
        }
예제 #2
0
 protected BatchSendingComponent(BatchSendingManager manager)
 {
     if (manager.IsDisposed)
     {
         throw new InvalidOperationException("Cannot create BatchCreationComponent:" + GetType() + " on Disposed BatchCreationManager");
     }
     Manager = manager;
 }
예제 #3
0
        public static void RunScheduledBatchSending(MessagesModuleLogic Logic, BatchSendingTaskSettings Settings = null)
        {
            if (!ScheduledBatchSending_H.GetSafeThreadPermission())
            {
                return;
            }
            try {
                Settings = Settings ?? DefaultsBatchSendingTaskSettings;
                using (var manager = BatchSendingManager.NewInstance(Settings, Logic)) {
                    var allPendingMails = manager.GetPendingEmails();
                    var allPendingSms   = manager.GetPendingSms();

                    var batches = allPendingMails
                                  .Select(x => x.tblMessageBatch)
                                  .Distinct()
                                  .Concat(allPendingSms
                                          .Select(x => x.tblMessageBatch)
                                          .Distinct())
                                  .ToArray();

                    //EMAIL
                    var emailProviders = manager.GetActiveEmailProviders().ToList().GetEnumerator();
                    var Emailer        = new EmailSender(manager);
                    SendCycle(manager, allPendingMails, emailProviders, Emailer);
                    //SMS
                    var smsProviders = manager.GetActiveSmsProviders().ToList().GetEnumerator();
                    var Smser        = new SmsSender(manager);
                    SendCycle(manager, allPendingSms, smsProviders, Smser);

                    foreach (var batch in batches)
                    {
                        //check if batch finished
                        if (!batch.tblMessages.Where(x => (x.tblPendingMessagesQueue != null) && (!x.tblPendingMessagesQueue.Deleted)).Any())
                        {
                            batch.FinishedOn = DateTime.Now;
                        }
                        //TODO THIS CHECK IS NOT RIGHT DECISION
                        //add errors to batch if there are some
                        if (batch.tblMessages.Where(x => x.ErrorLog != null).Any())
                        {
                            (batch as IErrorLoged).AddError("Some errors have arisen at sending stage at " + DateTime.Now.ToShortDateString());
                        }
                        manager.Logic.SaveLazy(batch);
                    }
                    Logic.SaveChanges();
                    //Logic.Dispose();
                }
            }
            finally {
                ScheduledBatchSending_H.ReportTaskEnded();
            }
        }
예제 #4
0
 public SmsSender(BatchSendingManager manager) : base(manager)
 {
 }
예제 #5
0
 public EmailSender(BatchSendingManager manager) : base(manager)
 {
 }