صيغة كرون في Quartz
يتكوّن تعبير Quartz من ستة حقول إلزامية وحقل سابع اختياري للسنة، تفصل بينها مسافات:
| الحقل | القيم المسموحة | الرموز الخاصة |
|---|---|---|
| الثانية | 0–59 | , - * / |
| الدقيقة | 0–59 | , - * / |
| الساعة | 0–23 | , - * / |
| يوم الشهر | 1–31 | , - * ? / L W |
| الشهر | 1–12 أو JAN–DEC | , - * / |
| يوم الأسبوع | 1–7 أو SUN–SAT (1 = الأحد) | , - * ? / L # |
| السنة | 1970–2099 (اختياري) | , - * / |
الرموز الخاصة
| الرمز | المعنى |
|---|---|
? | بلا قيمة محددة. يجب وضعه في أحد حقلي يوم الشهر ويوم الأسبوع فقط: 0 0 12 * * ? أو 0 0 12 ? * MON. |
L | الأخير. في حقل يوم الشهر يعني L آخر يوم في الشهر، وL-2 ما قبله بيومين. وفي حقل يوم الأسبوع يعني L وحده السبت، و6L آخر جمعة في الشهر. |
W | أقرب يوم عمل (من الإثنين إلى الجمعة) إلى تاريخ معيّن دون الخروج من الشهر: 15W. أما LW فهو آخر يوم عمل في الشهر. |
# | ترتيب اليوم في الشهر: 6#3 هو ثالث جمعة، و2#1 أول إثنين. |
/ | خطوة التكرار: 0/15 و*/15 في حقل الدقائق يعنيان كل 15 دقيقة بدءًا من الدقيقة 0. |
أمثلة على كرون Quartz
اضغط على أي تعبير لتحميله في المولّد أعلاه.
| التعبير | الجدول الزمني |
|---|---|
| في تمام الساعة 12:00 م. | |
| كل 5 دقائق. | |
| في تمام الساعة 8:00 ص، من الإثنين إلى الجمعة. | |
| كل 30 دقيقة، بين 9:00 ص و5:59 م، من الإثنين إلى الجمعة. | |
| في تمام الساعة 10:15 ص، في آخر يوم من الشهر. | |
| في تمام الساعة 6:00 م، في آخر يوم عمل (من الإثنين إلى الجمعة) من الشهر. | |
| في تمام الساعة 12:00 م، في ثالث جمعة من الشهر. | |
| في تمام الساعة 9:00 ص، في آخر جمعة من الشهر. | |
| في تمام الساعة 12:00 ص، في اليوم 1 من الشهر، في شهر يناير فقط، في عام 2027. |
الفرق بين كرون Quartz وكرون تاب في لينكس
- يبدأ التعبير بحقل الثواني، فالتعبير
0 */5 * * * ?يعمل كل خمس دقائق عند الثانية 0. وإذا لصقت سطر كرون تاب بخمسة حقول فسيرفضه Quartz. - الأحد هو
1والسبت هو7. فالنطاق1-5(من الإثنين إلى الجمعة) في لينكس يصبح2-6في Quartz، لذا فالأسماء مثلMON-FRIأكثر أمانًا. - يجب أن يكون أحد حقلي اليوم
?. فالتعبير0 0 12 * * *يسبّب الخطأ «Support for specifying both a day-of-week AND a day-of-month parameter is not implemented»، والصواب0 0 12 * * ?. - لا توجد اختصارات مثل
@daily، لكن يوجد حقل اختياري للسنة والرموزLوWو#.
الاستخدام في Java
مرّر التعبير إلى CronScheduleBuilder وحدّد المنطقة الزمنية صراحةً، وإلا فسيستخدم Quartz المنطقة الافتراضية لـ JVM:
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("weekdayReport")
.withSchedule(CronScheduleBuilder
.cronSchedule("0 0 8 ? * MON-FRI")
.inTimeZone(TimeZone.getTimeZone("Asia/Riyadh")))
.build();
الأسئلة الشائعة
لماذا يرفض Quartz التعبير 0 0 12 * * *؟
لا يسمح Quartz بتحديد حقلي اليوم معًا، والنجمة * تُعدّ تحديدًا لأحدهما. ضع ? في الحقل الذي لا تحتاجه: 0 0 12 * * ? يعمل كل يوم ظهرًا، و0 0 12 ? * MON-FRI يعمل من الإثنين إلى الجمعة فقط.
هل الأحد 0 أم 1 في تعبير Quartz؟
الأحد هو 1 والسبت هو 7، بخلاف كرون لينكس الذي يعدّ الأحد 0. ويرفض Quartz القيمة 0 في حقل يوم الأسبوع، لذا فكتابة SUN–SAT تجنّبك الأخطاء عند نقل التعبيرات بين الأنظمة.
كيف أشغّل مهمة Quartz في آخر يوم من الشهر؟
ضع L في حقل يوم الشهر و? في حقل يوم الأسبوع: 0 0 18 L * ? يعمل الساعة 18:00 في آخر يوم من كل شهر. واستخدم LW لآخر يوم عمل، وL-2 لما قبل نهاية الشهر بيومين.
ما المنطقة الزمنية التي يستخدمها مشغّل كرون في Quartz؟
المنطقة الزمنية الافتراضية لـ JVM، ما لم تحدّد غيرها عبر inTimeZone(...) في CronScheduleBuilder. وكثيرًا ما تعمل الخوادم بتوقيت UTC، لذا حدّدها صراحةً إذا كان الجدول مرتبطًا بساعات الدوام المحلية.
مولدات كرون لمنصات أخرى
*/15 8-18 * * 1-5
مولد تعبيرات كرون لـ Spring
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