我正在使用石英计划程序在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
}
}
}
}
答案 0 :(得分:0)
假设您有两种电子邮件状态:“待定”和“已发送”。
您应该添加第三个称为“发送”的中间状态,一旦您从队列中读取电子邮件,您应该将其状态更改为“正在执行”,以便其他线程/服务不会再次获取它。 / p>