quartz scheduler发送多个电子邮件通知

时间:2012-08-27 15:59:16

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

我正在使用石英计划程序在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 
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:0)

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

您应该添加第三个称为“发送”的中间状态,一旦您从队列中读取电子邮件,您应该将其状态更改为“正在执行”,以便其他线程/服务不会再次获取它。 / p>