در این قسمت، نحوهی استفاده از قابلیتهای کتابخانهی Quartz.NET را در قالب پرسش و پاسخ ادامه میدهیم.
ابتدا یک توضیح کلی:
برای مدیریت وظیفهها در Quartz.NET، در هر جای پروژه میتوانید به صورت ذیل به مدیر وظیفهها دسترسی داشته باشید.
کد:
var scheduler = new StdSchedulerFactory().GetScheduler();
از حالا به بعد، هر جا که در کدها کلمهی scheduler را دیدید، ایجاد آن از طریق خط قبل بوده است.
سعی کنید همیشه هنگام ایجاد اشیا از نوع IJobDetail و ITrigger، از متد WithIdentity (همان طور که در قسمت قبل مشاهده کردید) برای نامگذاری وظایف و triggerها استفاده کنید تا بتوانید بعداً با استفاده از نامشان به آنها ارجاع پیدا کرده و مدیریتشان کنید
1) سوال: چگونه میتوان در یک زمان دلخواه (مثلاً در زمان کلیک بر روی یک دکمه)، اجرای یک وظیفه را متوقف کرد؟
جواب: برای توقف تمامی وظایف میتوان از متد ()Shutdown شی scheduler استفاده کرد:
کد:
scheduler.Shutdown(true);
در صورتی که مقدار true را به متد Shutdown پاس دهید، تا زمانی که وظایفی که در وسط اجرای خود هستند کارشان به پایان نرسد، کنترل اجرای برنامه به خط بعد نمیرود، اما در صورتی که این متد را بدون پارامتر فراخوانی کنید یا مقدار false را به آن پاس دهید، کنترل اجرای برنامه به دستور بعد میرود و وظایف در پشت صحنه به کار خود ادامه میدهند. دقت داشته باشید که منظور از ادامهی کار یک وظیفه، ادامهی کار آن در وضعیت جاری خود است. به بیان واضح تر، اگر مرتبهی اجرای یک وظیفه 20 مرتبه بود و در مرتبهی دوم اجرای آن، متد ()Shutdown به هر صورتی فراخوانی شد، مرتبههای دیگر به هیچ وجه اجرا نمیشوند.
اگر چند وظیفه به طور همزمان در حال اجرا باشند و قصد داشته باشید تا یکی از آنها را متوقف کنید، یکی از دو حالت زیر وجود دارد:
1) یک وظیفه به چند trigger نسبت داده شده است.
2) هر وظیفه فقط یک trigger دارد.
در صورتی که قصد دارید وظیفه از تمامی triggerها گرفته شود (معمولاً هم همین رفتار مد نظر است)، از متد DeleteJob استفاده کنید؛ و اگر قصد دارید تا اجرای وظیفه توسط یک trigger مشخص لغو شود و triggerهای دیگر مختص آن وظیفه به کار خود ادامه دهند، از متد UnscheduleJob استفاده کنید. اگر از متد DeleteJob استفاده میکنید، نام وظیفه را با ایجاد نمونه ای از کلاس JobKey برای آن مشخص کنید و در صورتی که از متد UnscheduleJob استفاده میکنید، نام trigger را با ایجاد نمونه ای از کلاس TriggerKey تعیین کنید.
کد:
scheduler.DeleteJob(new JobKey("job1"));
// or
scheduler.UnscheduleJob(new TriggerKey("trigger1"));
2) سوال: چگونه میتوان اجرای وظیفهها را به حالت تعلیق در آورد؟
جواب: برای به تعلیق در آوردن اجرای تمامی وظایف، از متد ()StandBy استفاده کنید:
برای ادامهی کار، متد ()Start را مجدداً فراخوانی کنید.
در صورتی که قصد دارید اجرای وظیفه ای خاص را به حالت تعلیق در آورید، از متد ()PauseJob استفاده کنید. نام وظیفه را با ایجاد نمونه ای از کلاس JobKey برای آن مشخص کنید:
1
scheduler.PauseJob(new JobKey("job1"));
برای ادامهی وظیفه، از متد ()ResumeJob استفاده کنید. نام وظیفه را با ایجاد نمونه ای از کلاس JobKey برای آن مشخص کنید:
1
scheduler.ResumeJob(new JobKey("job1"));
برای تعلیق اجرای تمامی وظایف، متد ()PauseAll، و برای ادامهی کار تمامی وظایف، متد ()ResumeAll را فراخوانی کنید.
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;
متد ()GetMetaData، اطلاعاتی در مورد مدیر وظایف میدهد. نوع برگشتی این متد، SchedulerMetaData است. یکی از خصیصههای این نوع، NumberOfJobsExecuted نام دارد که تعداد دفعات اجرای تمامی وظایف تا زمان حال را برگشت میدهد.
7) سوال: چگونه میتوان زمان آغاز به کار مدیر زمانبندی را متوجه شد؟
پاسخ: یکی دیگر از خصیصههای نوع RunningSince ،SchedulerMetaData نام دارد که بدین منظور استفاده میشود.
کد:
SchedulerMetaData metaData = scheduler.GetMetaData();
DateTimeOffset? runningSince = metaData.RunningSince;
ادامه دارد...