ابتدا یک توضیح کلی:
برای مدیریت وظیفهها در Quartz.NET، در هر جای پروژه میتوانید به صورت ذیل به مدیر وظیفهها دسترسی داشته باشید.
var scheduler = new StdSchedulerFactory().GetScheduler();
سعی کنید همیشه هنگام ایجاد اشیا از نوع IJobDetail و ITrigger، از متد WithIdentity (همان طور که در قسمت قبل مشاهده کردید) برای نامگذاری وظایف و triggerها استفاده کنید تا بتوانید بعداً با استفاده از نامشان به آنها ارجاع پیدا کرده و مدیریتشان کنید
1) سوال: چگونه میتوان در یک زمان دلخواه (مثلاً در زمان کلیک بر روی یک دکمه)، اجرای یک وظیفه را متوقف کرد؟
جواب: برای توقف تمامی وظایف میتوان از متد ()Shutdown شی scheduler استفاده کرد:
scheduler.Shutdown(true);
اگر چند وظیفه به طور همزمان در حال اجرا باشند و قصد داشته باشید تا یکی از آنها را متوقف کنید، یکی از دو حالت زیر وجود دارد:
1) یک وظیفه به چند trigger نسبت داده شده است.در صورتی که قصد دارید وظیفه از تمامی triggerها گرفته شود (معمولاً هم همین رفتار مد نظر است)، از متد DeleteJob استفاده کنید؛ و اگر قصد دارید تا اجرای وظیفه توسط یک trigger مشخص لغو شود و triggerهای دیگر مختص آن وظیفه به کار خود ادامه دهند، از متد UnscheduleJob استفاده کنید. اگر از متد DeleteJob استفاده میکنید، نام وظیفه را با ایجاد نمونه ای از کلاس JobKey برای آن مشخص کنید و در صورتی که از متد UnscheduleJob استفاده میکنید، نام trigger را با ایجاد نمونه ای از کلاس TriggerKey تعیین کنید.
2) هر وظیفه فقط یک trigger دارد.
scheduler.DeleteJob(new JobKey("job1")); // or scheduler.UnscheduleJob(new TriggerKey("trigger1"));
2) سوال: چگونه میتوان اجرای وظیفهها را به حالت تعلیق در آورد؟
جواب: برای به تعلیق در آوردن اجرای تمامی وظایف، از متد ()StandBy استفاده کنید:
scheduler.Standby();
در صورتی که قصد دارید اجرای وظیفه ای خاص را به حالت تعلیق در آورید، از متد ()PauseJob استفاده کنید. نام وظیفه را با ایجاد نمونه ای از کلاس JobKey برای آن مشخص کنید:
scheduler.PauseJob(new JobKey("job1"));
scheduler.ResumeJob(new JobKey("job1"));
3) سوال: چگونه میتوان یک وظیفهی در حال اجرا را آپدیت کرد و تغییر مشخصات داد؟
جواب: با استفاده از متد AddJob و تنظیم پارامتر دوم آن به مقدار true:
IJobDetail job = JobBuilder.Create<NewJob>() .WithIdentity("job1") .Build(); scheduler.AddJob(job, true);
اگر قبلاً کلاسی با عنوان OldJob برای وظیفه ای با نام job1 تعریف شده است، با استفاده از قطعه کد بالا میتوان کلاس NewJob را به جای آن معرفی کرد. البته به شرطی که نام وظیفهی جدید با نام وظیفهی قدیم، یکسان باشد. پارامتر دوم متد AddJob مشخص میکند که آیا در صورتی که نام وظیفه ای که قرار است در فرایند زمانبندی قرار بگیرد با نام یکی از وظایف موجود یکسان باشد، وظیفهی جدید، جایگزین وظیفهی قدیم شود یا خیر.
4) سوال: چگونه میتوان یک trigger در حال اجرا را آپدیت کرد و تغییر مشخصات داد؟
جواب: یک trigger جدید ایجاد و با استفاده از متد ()RescheduleJob، جایگزین trigger قدیمی کنید:
ITrigger trigger = TriggerBuilder.Create() .WithIdentity("newTrigger") .StartNow() .ForJob("job1") .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).WithRepeatCount(20)) .Build(); scheduler.RescheduleJob(new TriggerKey("oldTrigger"), trigger);
نام trigger جدید میتواند با نام trigger قدیم یکسان باشد. در تکه کد قبل، triggerیی با نام newTrigger ایجاد و زمان اجرای آن به حال تنظیم شده است. با استفاده از متد ()ForJob و تعیین نام وظیفه، trigger جدید را به وظیفه ای با نام job1 نسبت داده ایم. بازهی زمانی اجرا، هر 5 ثانیه و 21 مرتبه خواهد بود. در متد ()RescheduleJob و در پارامتر اول آن، نام trigger قدیمی را با ایجاد شی ای از کلاس TriggerKey مشخص کرده ایم و به پارامتر دوم، شی ایجاد شده برای trigger جدید را پاس داده ایم.
5) سوال: چگونه میتوان تعداد دفعات اجرای یک وظیفه را بی نهایت تعیین کرد؟
پاسخ: با استفاده از متد ()RepeatForever در هنگام ایجاد trigger:
ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1") .StartAt(startTime) .ForJob("job1") .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever()) .Build();
6) سوال: چگونه میتوان تعداد دفعات اجرای تمامی وظایف را به دست آورد؟
پاسخ: با استفاده از متد ()GetMetaData:
SchedulerMetaData metaData = scheduler.GetMetaData(); int numberOfJobsExecuted = metaData.NumberOfJobsExecuted;
7) سوال: چگونه میتوان زمان آغاز به کار مدیر زمانبندی را متوجه شد؟
پاسخ: یکی دیگر از خصیصههای نوع RunningSince ،SchedulerMetaData نام دارد که بدین منظور استفاده میشود.
SchedulerMetaData metaData = scheduler.GetMetaData(); DateTimeOffset? runningSince = metaData.RunningSince;
ادامه دارد...