مجدول مهام Java: Quartz Scheduler — دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مجدول مهام Java: Quartz Scheduler



في التطوير الحديث بلغة Java، غالبًا ما تنشأ الحاجة لتنفيذ إجراءات معينة وفقًا لجدول زمني: إرسال النشرات البريدية، أرشفة السجلات، مزامنة البيانات، أو إنشاء التقارير. لحل هذه المهام، توجد مكتبة قوية ومرنة تسمى Quartz Scheduler. إنها إطار عمل مفتوح المصدر يسمح بإنشاء وجدولة وإدارة المهام (Jobs) باستخدام المشغلات (Triggers) وتعبيرات cron. يتكامل Quartz بسهولة مع Spring Boot وJava EE وأي تطبيقات مستقلة.



الميزات الرئيسية لـ Quartz

  • جدولة مرنة — دعم الفواصل الزمنية البسيطة (كل N ثانية/دقيقة) وتعبيرات cron المعقدة.
  • الاستمرارية — تخزين حالة المهام في قاعدة بيانات (JDBC JobStore) لاستعادتها بعد إعادة تشغيل التطبيق.
  • التجميع (Clustering) — توزيع المهام بين عدة عقد لتحقيق تحمل الأخطاء.
  • التنفيذ المتوازي — إمكانية تشغيل عدة مهام في وقت واحد.
  • التشغيلات الفائتة — ضبط السلوك أثناء فترة التوقف (misfire instructions).


التثبيت والإضافة

لاستخدام Quartz، أضف التبعية في ملف pom.xml (Maven):

<dependency>    <groupId>org.quartz-scheduler</groupId>    <artifactId>quartz</artifactId>    <version>2.3.2</version></dependency>


لـ Gradle:

implementation 'org.quartz-scheduler:quartz:2.3.2'


إنشاء مهمة بسيطة

كل مهمة في Quartz هي كلاس يقوم بتطبيق الواجهة Job. داخل طريقة execute() يتم كتابة منطق الأعمال.

import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;

public class HelloJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("مرحبًا! تم تنفيذ المهمة في " + new java.util.Date()); }}


إعداد المجدول والمشغل

يتم إنشاء المجدول (Scheduler) عبر المصنع StdSchedulerFactory. ثم يتم إنشاء مشغل — بسيط (SimpleTrigger) أو قائم على cron (CronTrigger).

import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;

public class QuartzExample { public static void main(String[] args) throws SchedulerException { // 1. الحصول على المجدول Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// 2. تعريف المهمة JobDetail job = JobBuilder.newJob(HelloJob.class) .withIdentity("myJob", "group1") .build();

// 3. إنشاء مشغل — تشغيل كل 10 ثوانٍ Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever()) .build();

// 4. ربط المهمة بالمشغل وتشغيل المجدول scheduler.scheduleJob(job, trigger); scheduler.start(); }}


استخدام تعبيرات cron

تسمح تعبيرات cron بتحديد جداول زمنية معقدة. التنسيق: الثواني الدقائق الساعات يوم-الشهر الشهر يوم-الأسبوع.

// تشغيل كل يوم في الساعة 18:30CronScheduleBuilder cronSchedule = CronScheduleBuilder        .dailyAtHourAndMinute(18, 30);

// أو يدويًا: "0 30 18 * * ?" (كل يوم في الساعة 18:30)Trigger cronTrigger = TriggerBuilder.newTrigger() .withIdentity("cronTrigger", "group1") .withSchedule(CronScheduleBuilder.cronSchedu

توصيات