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