0

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

http://quartznet.sourceforge.net/

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

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

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

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

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 
                    }
                }
            }
        }
4

1 回答 1

0

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

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

于 2012-08-27T16:07:55.537 回答