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(); } })); }); }