【问题标题】:quartz scheduler sending multiple email notifications石英调度程序发送多个电子邮件通知
【发布时间】:2012-08-27 15:59:15
【问题描述】:

我正在使用石英计划在 asp.net mvc 应用程序中安排作业。此计划在固定时间间隔后安排作业。

http://quartznet.sourceforge.net/

我创建的服务基本上每分钟运行一次。它从 消息队列(在我的情况下为数据库)每 1 分钟发送一封电子邮件并更新消息发送状态 为真。 不过我遇到了一些问题。具体来说,问题是由于下面提到的原因,服务会两次发送相同的电子邮件。

在某些情况下,在数据库更新发生之前,只要发送一封电子邮件,就会调用该服务。由于在发送电子邮件和再次调用服务后不会发生数据库更新,因此处理过的消息会再次从数据库中读取为未读消息并被重新发送。

从数据库中再次读取相同的消息。因此服务结束发送相同的消息两次。

如何在我的代码中处理这种情况。

public void Execute(JobExecutionContext context)
        {
            List<QueuedEmail> lstQueuedEmail =
                _svcQueuedEmail.Filter((x => x.IsSent == false)).Take(NO_OF_MAILS_TO_SEND).ToList();
            if (lstQueuedEmail.Count > 0)
            {
                foreach (var queuedEmail in lstQueuedEmail)
                {
                    try
                    {
                        bool emailSendStatus = false;

                        emailSendStatus = EmailHelper.SendEmail(queuedEmail.From, queuedEmail.To, queuedEmail.Subject,
                                                                queuedEmail.Body, queuedEmail.FromName);
                        QueuedEmail objQueuedEmail =
                            _svcQueuedEmail.Filter(x => x.Id == queuedEmail.Id).FirstOrDefault();
                        if (emailSendStatus)
                        {
                            objQueuedEmail.IsSent = true;
                            objQueuedEmail.SentOnUtc = DateTime.UtcNow;
                        }
                        else
                        {
                            objQueuedEmail.IsSent = false;
                            if (objQueuedEmail.SentTries == null)
                            {
                                objQueuedEmail.SentTries = 1;
                            }
                            else
                            {
                                objQueuedEmail.SentTries += 1;
                            }
                        }
                        _svcQueuedEmail.Update(objQueuedEmail);
                    }
                    catch (Exception)
                    {
                        //log error 
                    }
                }
            }
        }

【问题讨论】:

    标签: asp.net asp.net-mvc scheduled-tasks


    【解决方案1】:

    假设您的电子邮件有两种状态:“待处理”和“已发送”。

    您应该添加第三个中间状态,称为“正在发送”,一旦您从队列中读取电子邮件,您应该将其状态更改为“正在执行”,这样其他线程/服务就不会再收到它了。

    【讨论】:

      猜你喜欢
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多