استفاده از عبارات Cron در Quartz.NET
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: سه دقیقه

Cron چیست؟
قابلیتی است در سیستم عامل‌های مبتنی بر یونیکس که وظیفه اجرای وظایف در زمانبندی‌های خاص را بر عهده دارد، و به کاربران این امکان را می‌دهد که وظایف را زمانبندی کرده و در دوره‌های مشخص اجرا کنند.
اطلاعات بیشتر

در حقیقت رشته هایی هستند که از هفت قسمت تشکیل شده اند که هر قسمت مشخص کننده اعمال مربوط به زمانبندی می‌باشد مثلا انجام اعمالی :

  1. اجرای وظیفه ایی خاص هر روز ساعت 8 صبح
  2. اجرای وظیفه ایی خاص هر جمعه آخر ماه
  3. و...

این هفت قسمت توسط فاصله از همدیگر جدا می‌شوند :

عبارات cron خیلی قدرتمتد هستند و در عین حال مقداری پیچیده، هدف از ارائه این مطلب آشنایی با این نوع از عبارات و استفاده از آنها در Quartz.NET می‌باشد.

قبل از هر چیز ایتدا باید با فرمت این عبارات آشنا شویم :


پس عبارات cron در ساده‌ترین حالت می‌توانند به صورت :
* * * * ? *
و در حالت پیچیده‌تر می‌توانند به صورت زیر باشند :
0/5 14,18,3-39,52 * ? JAN,MAR,SEP MON-FRI 2002-2010
کارکترهای خاص :
  • * به معنی "تمام حالات" می‌باشد به عنوان مثال در فیلد "دقیقه" به معنی هر دقیقه می‌باشد.
  • ؟ به معنی "نگذاشتن مقداری خاص" می‌باشد، به عنوان مثال می‌خواهیم کار ما در یک روز خاص از ماه اتفاق بیفتد اما مهم نیست چه روزی از هفته باشد.
  • - جهت تعیین یک رنج خاص (محدوده ایی خاص) به عنوان مثال "12-10" در فیلد ساعت به معنی "ساعت هایی 10، 11 و 12" می‌باشد.
  • , جهت تعیین مقادیر اضافی برای مثال "MON,WED,FRI" در فیلد  day-of-week به معنای "روزه‌های دوشنبه، چهارشنبه و جمعه" می‌باشد.
  • / جهت اعمالی increment(کاهشی) استفاده می‌شود به طور مثال "0/15" در فیلد seconds به معنای "ثانیه‌های 0 ، 15 ، 30 ، 45" می‌باشد، "5/15" نیز به معنای "ثانیه‌های 5 ، 20 ، 35 ، 50" می‌باشد، به صورت ساده‌تر به طور مثال اگر مقدار "0/15" را در فیلد "minutes" قرار دهیم به معنی "هر 15 دقیقه است و از دقیقه 0 آغاز میشود" با مثلا "3/20"به معنی "هر 20 دقیقه می‌باشد و از دقیقه سوم آغاز میشود".
  • L "آخرین (Last)" همانطور که از شکل بالا مشخص است تنها در فیلدهایی Day of month و Day of week قابل استفاده می‌باشد به طور مثال اگر در فیلد Day of month استفاده شود به معنای "آخرین روز ماه" می‌باشد.
  • W "روز هفته(Weekday)" 
  • # جهت تعیین Xامین روز ماه به طور مثال مقدار "3#6" به "معنای سومین جمعه ماه" می‌باشد، در واقع مقدار 6 روز و مقدار 3# سومین در ماه می‌باشد.

تعدای مثال :

تولید عبارات cron گاهی اوقات به نظر پیچیده می‌آید(به نظر من که اینطور نیست!) اما برای تولید آسان این عبارات می‌توانید از این سرویس آنلاین استفاده نمائید.

حال یک مثال در این رابطه :

می خواهیم یک کار را هر شب ساعت 11 شب برای انجام زمانبندی کنیم:

public class HelloSchedule : ISchedule
    {
        public void Run()
        {

            IJobDetail job = JobBuilder.Create<HelloJob>()
                                       .WithIdentity("job1")
                                       .Build();

            ITrigger trigger = TriggerBuilder.Create()
                                             .ForJob(job)
                                             .WithIdentity("trigger1")
                                             .StartNow()
                                             .WithCronSchedule("0 0 23 ? * MON-FRI *")
                                             .Build();

            ISchedulerFactory sf = new StdSchedulerFactory();
            IScheduler sc = sf.GetScheduler();
            sc.ScheduleJob(job, trigger);

            sc.Start();
        }
کدهای فوق دقیقا همانند مثالهایی هستند که پیشتر در سایت مشاهده کرده اید با این تفاوت به جای استفاده از متد WithSimpleScheduleاز متد WithCronSchedule استفاده می‌کنیم که پارامتر ورودی آن عبارت cron ما می‌باشد.
  • #
    ‫۱۱ سال و ۳ ماه قبل، شنبه ۸ تیر ۱۳۹۲، ساعت ۱۵:۲۲
    cron امکان جالبی است برای Quartz.Net اما تا جایی که من اطلاع دارم از شمسی پشتیبانی نمی‌کند. آیا اخیرا اقدامی در این زمینه صورت گرفته است؟
    • #
      ‫۱۱ سال و ۳ ماه قبل، شنبه ۸ تیر ۱۳۹۲، ساعت ۱۸:۰۳
      بله همینطوره، من هم اقدامی رو در این رابطه تا به حال ندیده ام.
  • #
    ‫۹ سال و ۵ ماه قبل، جمعه ۱۱ اردیبهشت ۱۳۹۴، ساعت ۱۷:۲۵
    با سلام و تشکر از مطالب مفیدتون . اگر بخواهیم یک Query را هر یک ساعت یک بار اجرا کنیم چگونه امکان پذیر است . منظور ایجاد job در آن به چه صورت خواهد بود؟
    • #
      ‫۹ سال و ۵ ماه قبل، جمعه ۱۱ اردیبهشت ۱۳۹۴، ساعت ۱۸:۰۵
      همانطور که عنوان شد از این سایت برای تولید عبارت Cron موردنظرتون می‌تونید استفاده کنید. نحوه ایجاد Job هم قبل بحث شده (+،  +)
  • #
    ‫۸ سال و ۵ ماه قبل، دوشنبه ۱۳ اردیبهشت ۱۳۹۵، ساعت ۲۰:۱۰
    تشکر میکنم از مطلب خوب و بسیار کاربردی تان
    فقط می‌خواستم یک نکته ای رو بگم ، اینجا که فرمودید

    / جهت اعمالی increment(کاهشی) استفاده می‌شود به طور مثال "0/15"  ...

    فکر می‌کنم به اشتباه درون پرانتز نوشته اید کاهشی در حالی که افزایشی می‌باشد.
    باتشکر