مجدول المهام بلغة TypeScript: دليل شامل
مجدول المهام (task scheduler) هو أداة تسمح بتشغيل الدوال أو البرامج النصية في وقت محدد أو بوتيرة معينة. في نظام TypeScript البيئي، توجد عدة مكتبات ناضجة لتنفيذ مثل هذه السيناريوهات: من المؤقتات البسيطة إلى أنظمة cron القوية. في هذه المقالة، سنستعرض الأساليب الرئيسية ونوضح كيفية استخدامها في المشاريع الحقيقية.
لماذا نحتاج إلى مجدول المهام؟
أتمتة الإجراءات المتكررة هي مهمة أساسية لأي تطبيق خادم. السيناريوهات النموذجية:
- إرسال إشعارات البريد الإلكتروني كل ساعة.
- تنظيف الملفات المؤقتة كل ليلة.
- جمع التحليلات في نهاية اليوم.
- تحديث ذاكرة التخزين المؤقت وفقًا لجدول زمني.
في TypeScript (و JavaScript) توجد آلية أساسية مدمجة — setInterval و setTimeout، ولكن للجداول الزمنية المعقدة، من الأسهل استخدام مكتبات متخصصة.
الأدوات المدمجة: setInterval و setTimeout
أبسط طريقة هي استخدام الدوال العامة:
// مثال: التنفيذ كل 5 ثوانٍconst intervalId = setInterval(() => { console.log('تم تنفيذ المهمة في', new Date().toISOString());}, 5000);
// الإيقاف بعد 30 ثانيةsetTimeout(() => { clearInterval(intervalId); console.log('تم إيقاف المجدول');}, 30000);الإيجابيات: لا يتطلب تثبيت، يعمل في أي بيئة. السلبيات: لا يدعم تعبيرات cron، صعوبة إدارة المهام الفائتة.
مكتبة node-cron
واحدة من أشهر المكتبات لـ Node.js. تعمل بتنسيق cron الكلاسيكي (5 حقول): الدقائق، الساعات، يوم الشهر، الشهر، يوم الأسبوع.
التثبيت
npm install node-cronnpm install @types/node-cronمثال على الاستخدام
import * as cron from 'node-cron';
// مهمة: كل دقيقةcron.schedule('* * * * *', () => { console.log('تشغيل كل دقيقة');});
// مهمة: كل يوم في الساعة 9:30 صباحًاcron.schedule('30 9 * * *', () => { console.log('مهمة يومية في 9:30');});
// مهمة: أيام العمل في الساعة 18:00cron.schedule('0 18 * * 1-5', () => { console.log('أيام العمل في 18:00');});إدارة المهام
import * as cron from 'node-cron';
const task = cron.schedule('*/5 * * * *', () => { console.log('كل 5 دقائق');});
// إيقاف المهمةtask.stop();
// استئنافtask.start();
// التحقق من الحالةconsole.log(task.isActive()); // true أو falseمكتبة croner
بديل أكثر حداثة، مكتوب بلغة TypeScript من الصفر. يدعم بناء الجملة الموسع (الثواني، أسماء الأشهر) ويعمل في كل من Node.js والمتصفح.
التثبيت
npm install cronerمثال مع الثواني
import Cron from 'croner';
// كل 10 ثوانٍconst job = new Cron('*/10 * * * * *', () => { console.log('تشغيل كل 10 ثوانٍ');});
// مهمة: كل يوم اثنين في الساعة 8:30 صباحًاconst weeklyJob = new Cron('30 8 * * 1', () => { console.log('الاثنين، 8:30');});
// الإيقاف بعد دقيقة واحدةsetTimeout(() => { job.stop(); console.log('تم إيقاف المهمة');}, 60000);الإمكانيات المتقدمة
import Cron from 'croner';
// مهمة مع اسم ومنطقة زمنيةconst job = new Cron('0 9 * * *', { name: 'morning-report', timezone: 'Europe/Moscow'}, () => { console.log('التقرير الصباحي بتوقيت موسكو');});
// الحصول على وقت التنفيذ التاليconst nextRun = job.nextRun();console.log('التشغيل التالي:', nextRun.toISOString());
// قائمة بجميع المهام النشطةconst activeJobs = Cron.getJobs();console.log('المهام النشطة:', activeJobs.length);مقارنة بين node-cron و croner
- node-cron — مكتبة مجربة عبر الزمن