دقیقا این کاری بود که من قبلا انجام داده بودم ولی مشکلی که پیش میآمد این بود که مثلا اگر در یک ارسال بایستی 200 پیامک ارسال گردد قبل از اینکه ارسال این 200 پیامک به اتمام برسد زمان اجرا به پایان رسیده و تابع execute مجددا فراخوانی میشود و از انجایی که هنوز وضعیت این رکورد در دیتابیس به ارسال شده تغییر پیدا نکرده مجددا این 200 پیامک ارسال میگردد. این مشکل حتی زمانی که از حلقه for هم استفاده نمیشود وجود دارد و در تعداد ارسال بالا به مشکل میخورد .
در زیر کدی که برای ارسال استفاده نموده ام را قرار دادم.
با تشکر از شما
در زیر کدی که برای ارسال استفاده نموده ام را قرار دادم.
با تشکر از شما
namespace SchedulerDemo.Jobs { using System; using System.Linq; using System.IO; using Quartz; using System.Collections.Generic; using System.Configuration; [PersistJobDataAfterExecution] [DisallowConcurrentExecution] public class SendJob : IJob { public void Execute(IJobExecutionContext context) { using (var db = new DALModel.DALEntities()) { byte status = (byte)AllEnums.Sms.Status.InProgress; var item = db.SentBoxes.Where(p => p.Status == status && p.IsDeleted==false && p.UserInfo.IsDeleted==false && p.HasTime == true && p.SendInTime == false && p.SendDateX <= DateTime.Now).OrderBy(p=>p.Id).FirstOrDefault(); Cls_SMS.ClsSend sms_Batch = new Cls_SMS.ClsSend(); if (item != null) { decimal smsCount = 0; if (item.UserInfo.CalculateType == Convert.ToByte(AllEnums.FinancialTransaction.CalculationUnit.Message)) { smsCount = Convert.ToDecimal(Function.GetSmsCount(item.Price, item.UserId)); } else { smsCount = Convert.ToDecimal(item.CorrectCount); } decimal adminCredit = Function.GetAdminCreditLink1000(); if (adminCredit != -1 && adminCredit >= smsCount) { if ((item.UserInfo.Credit - (item.UserInfo.LowCredit)) >= item.Price) { item.SendInTime = true; db.SaveChanges(); string numberList = item.NumberList; int position = item.NumberList.LastIndexOf(','); numberList = item.NumberList.Substring(0, position); List<string> receivers_List = new List<string>(); receivers_List = (numberList).Split(',').ToList(); string[] ret2 = new string[2]; string[] DestAdd = new string[receivers_List.Count]; DestAdd = receivers_List.ToArray(); ret2 = sms_Batch.SendSMS_Batch(item.Message, DestAdd, item.UserInfoSenderNumber.AllNumber.Number, ConfigurationManager.AppSettings["SmsUserNameLink1000"], ConfigurationManager.AppSettings["SmsPasswordLink1000"], ConfigurationManager.AppSettings["SmsIPAddressLink1000"], ConfigurationManager.AppSettings["SmsCompanyLink1000"], false, item.Id); var sentBoxUpdate = db.SentBoxes.FirstOrDefault(p => p.Id == item.Id); sentBoxUpdate.Status = Convert.ToByte(AllEnums.Sms.Status.Send); sentBoxUpdate.FinancialTransactionId = db.FinancialTransactions.Where(p => p.UserId == item.UserId).Max(p => p.Id); if (ret2 != null) { sentBoxUpdate.RetValue0 = ret2[0]; sentBoxUpdate.RetValue1 = ret2[1]; } db.SaveChanges(); } else { byte statusFailedForAccount = (byte)AllEnums.Sms.Status.FailedForAccount; item.SendInTime = true; item.Status = statusFailedForAccount; item.FailedCount = item.CorrectCount; item.FailedList = item.NumberList; db.SaveChanges(); } } else { byte statusFaildForError = (byte)AllEnums.Sms.Status.FaildForError; item.SendInTime = true; item.Status = statusFaildForError; item.FailedCount = item.CorrectCount; item.FailedList = item.NumberList; db.SaveChanges(); } } } } } } namespace SchedulerDemo.Interfaces { public interface IScheduleSend { void RunSendSms(); } } namespace SchedulerDemo.Jobs { using System; using Quartz; using Quartz.Impl; using SchedulerDemo.Interfaces; using SchedulerDemo.Jobs; public class SendSchedule : IScheduleSend { public void RunSendSms() { DateTimeOffset startTime = DateBuilder.FutureDate(2, IntervalUnit.Second); IJobDetail job = JobBuilder.Create<SendJob>() .WithIdentity("jobSendSmsInTime") .Build(); ITrigger trigger = TriggerBuilder.Create() .WithIdentity("triggerSendSmsInTime") .StartAt(startTime) .WithSimpleSchedule(x => x.WithIntervalInMinutes(5).RepeatForever()) .Build(); ISchedulerFactory sf = new StdSchedulerFactory(); IScheduler sc = sf.GetScheduler(); sc.ScheduleJob(job, trigger); sc.Start(); } } }