مجدول مهام Java: Quartz Scheduler — أداة قوية للأتمتة
في التطوير الحديث بلغة Java، غالبًا ما تنشأ الحاجة لتنفيذ إجراءات معينة وفقًا لجدول زمني: إرسال التقارير، تنظيف ذاكرة التخزين المؤقت، مزامنة البيانات، أو تشغيل العمليات الخلفية. java.util.Timer المدمج و ScheduledExecutorService مناسبان للسيناريوهات البسيطة، ولكن للأنظمة المؤسسية المعقدة، يلزم حل أكثر مرونة وموثوقية. هذا الحل هو Quartz Scheduler — مكتبة مفتوحة وقوية لجدولة المهام في Java.
ما هو Quartz Scheduler؟
Quartz هي مكتبة مفتوحة المصدر تتيح لك إنشاء وجدولة وتنفيذ المهام (Jobs) بدقة عالية. وهي تدعم:
- مشغلات مرنة تعتمد على تعبيرات cron وفواصل زمنية بسيطة.
- تخزين دائم للمهام في قواعد البيانات (JDBC).
- التجميع (Clustering) لتحمل الأخطاء.
- التنفيذ المتوازي وإدارة الخيوط.
- الاستماع للأحداث (Listeners) للمراقبة.
يُستخدم Quartz بنشاط في Spring Framework (عبر الوحدة spring-boot-starter-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(JobExecutionContext context). - JobDetail — وصف المهمة (الاسم، المجموعة، البيانات).
- Trigger — قاعدة التشغيل (الوقت، الفاصل الزمني، cron).
- Scheduler — المكون الرئيسي الذي يدير جميع المهام.
مثال: مجدول بسيط مع تعبير cron
لننشئ مهمة تطبع رسالة كل 10 ثوانٍ.
الخطوة 1. تنفيذ Job
import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;
public class SimpleJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("تم تنفيذ المهمة! الوقت: " + System.currentTimeMillis()); }}الخطوة 2. إعداد Scheduler وتشغيله
import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;
public class QuartzExample { public static void main(String[] args) throws SchedulerException { // 1. إنشاء مصنع والحصول على المجدول Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start();
// 2. إنشاء JobDetail JobDetail job = JobBuilder.newJob(SimpleJob.class) .withIdentity("myJob", "group1") .build();
// 3. إنشاء Trigger مع تعبير cron (كل 10 ثوانٍ) Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")) .build();
// 4. جدولة المهمة scheduler.scheduleJob(job, trigger);
// 5. الانتظار لمدة 30 ثانية للعرض try { Thread.sleep(30000); } catch (InterruptedException e) { e.printStackTrace(); }
// 6. إيقاف المجدول schedule