0

All i am using a quartz schedular for scheduling a job in an asp.net mvc application.This schedular schedules a job after fixed interval of time.

http://quartznet.sourceforge.net/

The service i have created basically runs every minute.It reads the message from the message que(database in my case) every 1min , sends an email and updates the message sent status to true. I am having some problems though.TO be specific the problem is the service sends the same email twice because of the reasons mentioned below.

In some cases the service gets called as soon as an email is send before the db update happens.As The database update does not happen after sending email and service is invoked again,the processed message is again read from the database as unread message and gets resent.

The same message is read again from database.Thus the service ends of sending same message twice.

How do i handle this case in my code.

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

メールに「保留中」と「送信済み」の 2 つの状態があるとします。

「送信中」と呼ばれる 3 番目の中間状態を追加する必要があります。キューから電子メールを読むとすぐに、そのステータスを「実行中」などに変更して、他のスレッド/サービスが再度取得しないようにする必要があります。

于 2012-08-27T16:07:55.537 に答える