示例#1
0
        public void ProcessQueueProductEmail(string subscriberId)
        {
            _currentSubscription = _bus.SubscribeAsync <ProductMailQueueDto>(subscriberId, pmq =>
            {
                return(Task.Factory.StartNew(() =>
                {
                    var _productMailQueueRepositoryLocal =
                        ServiceLocator.Current.GetInstance <IMercuritusFullDomainRepository <ProductMailQueue> >();

                    var _userRepositoryLocal =
                        ServiceLocator.Current.GetInstance <IMercuritusFullDomainRepository <User> >();

                    var _unitWorkLocal =
                        ServiceLocator.Current.GetInstance <IMercuritusFullDomainUnitOfWork>();

                    Check.Require(pmq.ProductMailQueueID > 0, "productMailQueueId must be positive");

                    var productMailQueueToProcess = _productMailQueueRepositoryLocal.DbSet.Where(
                        x => x.ProductMailQueueID == pmq.ProductMailQueueID && x.Activate == true).FirstOrDefault();

                    Check.Require(productMailQueueToProcess != null, "productMailQueueId must be valid");
                    Check.Require(productMailQueueToProcess.QueueStatusID == (int)QueueStatusEnum.CREATED, "productMailQueue must be in CREATED mode");

                    try
                    {
                        var now = DateTime.Now;
                        productMailQueueToProcess.Message = "Processing...";
                        productMailQueueToProcess.ModifiedOn = now;
                        productMailQueueToProcess.QueueStatusID = (int)QueueStatusEnum.PROCESSING;
                        _productMailQueueRepositoryLocal.Update(productMailQueueToProcess);
                        _unitWorkLocal.Commit();

                        var p = productMailQueueToProcess.Product;
                        Check.Require(p.UserID.HasValue, "product must be assigned to a user, for email adress");
                        var u = _userRepositoryLocal.GetById(p.UserID.Value);
                        var template = productMailQueueToProcess.MailerTemplate;

                        var m = new FluentEmail.Email("*****@*****.**", "Mendeo - No Reply")
                                .To(u.EMail)
                                .Subject(template.Subject)
                                .UsingTemplate(template.Body, p, template.IsHtml);

                        m.Send();

                        var nowSent = DateTime.Now;
                        productMailQueueToProcess.Message = "Sent...";
                        productMailQueueToProcess.ModifiedOn = nowSent;
                        productMailQueueToProcess.QueueStatusID = (int)QueueStatusEnum.SUCCESS;
                        _productMailQueueRepositoryLocal.Update(productMailQueueToProcess);
                    }
                    catch (Exception e)
                    {
                        var nowError = DateTime.Now;
                        productMailQueueToProcess.Message = e.Message;
                        productMailQueueToProcess.ModifiedOn = nowError;
                        productMailQueueToProcess.QueueStatusID = (int)QueueStatusEnum.ERROR;
                        _productMailQueueRepositoryLocal.Update(productMailQueueToProcess);
                    }
                    finally
                    {
                        _unitWorkLocal.Commit();
                    }
                }));
            });
        }