ایجاد زمانبندی در برنامه های جاوا
گاهی وقت ها، عملیات سیستم را در زمان هایی که تعداد درخواست ها به سیستم کم است(ممکن است در بازه ای از زمان دچار کمبود منابع باشیم) یا قرار است در یک بازه زمانی مشخص عملیات ثابت و تکراری، انجام شود از زمانبندی(scheduling) استفاده می کنیم.
در Spring boot برای فعال سازی زمانبندی(scheduling) نیازی نیست وابستگی خاصی را اعمال نماییم. تنها کافی ایست بالاسر متد main از انوتیشن EnableScheduling@ استفاده نماییم تا کانتینر spring هر متدی که انوتیشن Scheduled@ را دارد را شناسایی کند.
نکته: در صورتی که بخواهید امکان فعال و غیرفعال سازی زمان بندی را داشته باشید تنها کافی از انوتیشن ConditionalOnProperty@ در بالاسر کلاس مربوطه استفاده نمایید.
@ConditionalOnProperty(name = "spring.enable.scheduling")
public class ScheduleEnabling {}
و مقدار true/false بودن را از طریق فایل application.properties در اختیار برنامه قرار دهید.
spring.enable.scheduling = true
برای اجرای یک متد در زمان مشخص/یا زمان های متعدد، باید از انوتیشن Scheduled@ در بالاسر متد مربوطه استفاده نمایید، که به صورت کلی 4 نوع ورودی fixedDelay،fixedRate،initialDelay و cronرا دارد.( امکان ورودی داده به صورت عددی و رشته را نیز دارد.)
نوع 1:fixedRate
در این مدل بیان می شودکه حتما در زمان مشخص متد اجرا شود، بر اساس این که مقدار fixedRate یا fixedRateString را انتخاب کرده باشید امکان ورود مددت زمان تکرار با عدد یا رشته را دارید.می تونیم مقدار را در فایل application.properties نیز قرار دهیم.
مقدار عددی fixedRate باید بر اساس میلی ثانیه باشد برای مثال برای 1 ثانیه باید مقدار 1000 را وارد نمایید. در fixedRateString نیز با فرمت خاص زیر می توانیم مقدار تکرار را بیان کنیم. در مثال زیر گفته شده هر 2 ثانیه متد رو اجرا کنه.(پیش فرض PT برای بیان استاندارد ISO-8601)
sample.schedule.string = PT2S
یکی از معایب fixedRate این است که منتظر اتمام اجرای قبلی نمی مونه و دقیقا در زمان تعیین شده دوباره اجرا می شود و امکان داره در برنامه هایی که چندین متد زمانبندی شده دارد دچار مشکل شود.
نوع 2:fixedDelay
خیلی شبیه قبلی کار می کند با این تفاوت که منتظر می ماند تا کار قبلی انجام شود و بعد زمان بندی جدید رو شروع می کند.
نوع 3:initialDelay
برای زمانی است که بخواهیم اجرای اول را در زمان متفاوتی انجام دهیم و بعد با fixed rate/fixed Delay تکرار های بعدی را مشخص کنیم.(اولین اجرا با تاخیر 1 ثانیه ای انجام می شود، سپس سایر اجرا ها هر 2 ثانیه)
@Scheduled(initialDelay = 1000, fixedRateString = "${sample.schedule.string}") public void scheduleTaskWithInitialDelay() throws InterruptedException { task1(); }
نوع 4 :cron
ممکن است شرایطی پیش بیاید که اجرای متد به فواصل زمانی خاصی نیاز داشته باشد. مثلا هر هفته یا آخر هر ماه یا ... .در این موارد بهتر است از عبارات cron استفاده نمایید.
ترتیب قرار گیری مقادیر به صورت زیر است.مقدار سال اجباری نمی باشد ولی سایر فیلد ها باید پر شود.
<second> <minute> <hour> <day-of-month> <month> <day-of-week> <year>
مقادیر مجازی که می توانید استفاده نمایید:
برای مثال عبارت : 2019 ? * * 12 0 0 یعنی در سال 2019 هر ماه و در هر روز ساعت 12 اجرا شود.
کارکتر های خاصی که در ستون آخر شکل بالا(یا تصویر زیر)قرار دارد را می توان به جای مقادیر عددی نیز گذاشت. که برای تعیین زمان بندی بهتر و حالات متخلف بسیار مناسب است.
ستاره که به مفهوم تمام ساعات یا دقیقه می باشد.اما اگر بخواهید زمان بندی در ساعات خاصی اجرا شود(برای مثال ساعات فرد یا زوج) تنها کافی ایست ساعت های مورد نظر خود را با کاما ( , )از هم جدا کنید مانند: * * * 5,7,9 5 زمان بندی شما در ساعات 5:5 - 7:5 - 9:5 انجام می شود.
اگر بخواهید زمان بندی شما در ساعاتی پشت هم انجام شود کافی ایست از - بین ساعات استفاده کنید مانند: * * * 9-5 5 زمان بندی شما سر ساعات 5:5 6:5 7:5 8:5 9:5 انجام می گردد.
حتی شما می توانید از چند کارکتر نیز بر اساس نیاز خودتان استفاده کنید و زمان بندی مورد نظر خود را بنویسید: * * * 9/2-5 5 مقدار 2/ یعنی سر ساعت دوم: 5:5 7:5 9:5
یکی از پارامترهایی که با cron می آید مقدار zone است که تعین کننده این است که اجرای متد براساس زمان چه کشوری باشد.(تمام مقادیر مجاز برای time zone)
@Scheduled(cron="0 0 12 * * ? 2019", zone="Europe/Paris")
public void doSomething() {
// Something
}
البته مثل موارد قبلی نیز، می توانیم مقدار عبارت cron را داخل فایل application.properties قرار دهیم و بخوانیم.
سایت های مختلفی وجود دارد که به صورت آنلاین مقدار cron شما را محاسبه یا زمان های بعدی اجرا را به شما نشان می دهد. مانند: Cron maker یا cron tab
مطلبی دیگر از این انتشارات
استاندارد اینستاگرام برای IGTV
مطلبی دیگر از این انتشارات
اوهایو 2045 یا OASIS؟! (نقد و بررسی فیلم سینمایی Ready Player One)
مطلبی دیگر از این انتشارات
طرح محرک اقتصادی بایدن در دورهی پاندمی: آزمایش ایدهی درآمد پایهی همگانی