صيغة كرون في Spring
يتكوّن تعبير كرون في Spring دائمًا من ستة حقول بالضبط، ولا يوجد حقل للسنة:
| الحقل | القيم المسموحة | الرموز الخاصة |
|---|---|---|
| الثانية | 0–59 | , - * / |
| الدقيقة | 0–59 | , - * / |
| الساعة | 0–23 | , - * / |
| يوم الشهر | 1–31 | , - * ? / L W |
| الشهر | 1–12 أو JAN–DEC | , - * / |
| يوم الأسبوع | 0–7 أو MON–SUN (0 و7 = الأحد) | , - * ? / L # |
الرموز الخاصة
| الرمز | المعنى |
|---|---|
? | مثل * تمامًا. يقبله Spring في حقلي اليوم حتى تعمل التعبيرات المكتوبة بأسلوب Quartz. |
L | الأخير: L هو آخر يوم في الشهر، وL-3 ما قبله بثلاثة أيام، و5L أو FRIL آخر جمعة في الشهر. |
W | أقرب يوم عمل إلى تاريخ معيّن: 1W أول يوم عمل في الشهر، وLW آخر يوم عمل. |
# | ترتيب اليوم في الشهر: 5#2 أو FRI#2 هو ثاني جمعة في الشهر. |
@ | الاختصارات: @yearly و@monthly و@weekly و@daily (أو @midnight) و@hourly. |
أمثلة على كرون Spring
اضغط على أي تعبير لتحميله في المولّد أعلاه.
| التعبير | الجدول الزمني |
|---|---|
| كل 5 دقائق. | |
| عند الدقيقة 0 من كل ساعة. | |
| في تمام الساعة 8:00 ص، من الإثنين إلى الجمعة. | |
| عند الدقيقة 0 من كل ساعة، بين 9:00 ص و5:59 م، من الإثنين إلى الجمعة. | |
| في تمام الساعة 12:00 ص، في اليوم 25 من الشهر، في شهر ديسمبر فقط. | |
| في تمام الساعة 12:00 ص، في آخر يوم من الشهر. | |
| في تمام الساعة 12:00 ص، في آخر يوم عمل (من الإثنين إلى الجمعة) من الشهر. | |
| في تمام الساعة 12:00 ص، في آخر خميس من الشهر. | |
| في تمام الساعة 12:00 ص، في ثاني جمعة من الشهر. | |
| في تمام الساعة 12:00 ص. |
الفرق بين كرون Spring وكرون لينكس
- ستة حقول تبدأ بالثواني. أي تعبير لينكس بخمسة حقول يفشل برسالة «Cron expression must consist of 6 fields»، والحل إضافة
0في بدايته:*/5 * * * *يصبح0 */5 * * * *. - الأحد هو
0أو7كما في كرون لينكس، وليس1كما في Quartz. - إذا حدّدت يوم الشهر ويوم الأسبوع معًا، فلن يشغّل Spring المهمة إلا في الأيام التي تطابق الحقلين معًا، أما كرون لينكس فيشغّلها عند تطابق أيٍّ منهما.
- لا يوجد حقل للسنة، والرمز
?يعني*ببساطة.
الاستخدام مع @Scheduled
فعّل الجدولة مرة واحدة باستخدام @EnableScheduling، ثم أضف التعليق التوضيحي إلى الدالة. تحدّد الخاصية zone المنطقة الزمنية، ومن دونها تُستخدم المنطقة الافتراضية للخادم:
@Configuration
@EnableScheduling
class SchedulingConfig {}
@Component
class ReportJob {
@Scheduled(cron = "0 0 8 * * MON-FRI", zone = "Asia/Riyadh")
void sendDailyReport() {
// 08:00 Riyadh time, Monday to Friday
}
}
ولتغيير الجدول دون إصدار جديد، اقرأه من الإعدادات باستخدام @Scheduled(cron = "${report.cron}")، واضبط report.cron=- لإيقاف المهمة.
الأسئلة الشائعة
لماذا تظهر رسالة «Cron expression must consist of 6 fields» في Spring؟
يتوقع Spring حقل الثواني قبل الدقائق. أضف 0 في بداية التعبير ذي الخمسة حقول: 0 9 * * 1-5 يصبح 0 0 9 * * 1-5 (الساعة 09:00 من الإثنين إلى الجمعة).
كيف أحدّد المنطقة الزمنية لمهمة @Scheduled؟
استخدم الخاصية zone: @Scheduled(cron = "0 0 2 * * *", zone = "Asia/Dubai"). ومن دونها يستخدم Spring المنطقة الزمنية الافتراضية للخادم، وغالبًا ما تكون UTC.
هل يدعم Spring الرموز L وW و# مثل Quartz؟
نعم، منذ الإصدار 5.3 من Spring Framework (Spring Boot 2.4): تعمل L وL-3 وLW و15W و5L و5#2. لاحظ أن Spring يعدّ الأحد 0 أو 7، لذا فآخر جمعة هي 5L في Spring لكنها 6L في Quartz.
مولدات كرون لمنصات أخرى
*/15 8-18 * * 1-5
مولد تعبيرات كرون Quartz
0 0 8 ? * MON-FRI
مولد تعبيرات كرون لـ AWS
0 8 ? * MON-FRI *
مولد تعبيرات كرون لـ Jenkins
H 2 * * 1-5
مولد تعبيرات كرون لـ Salesforce
0 0 8 ? * MON-FRI
مولد تعبيرات كرون لـ Hangfire
0 8 * * 1-5
مولد تعبيرات كرون لـ Airflow
0 6 * * 1-5
مولد تعبيرات node-cron
0 30 8 * * 1-5