【发布时间】: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