ما هي الـ Spring Cron Job
⏰ ما هي الـ Spring Cron Job؟
هي آلية داخل Spring Framework بتسمح لك تشغل مهام (tasks) بشكل تلقائي ومجدول
مثلاً:
- كل دقيقة
- كل يوم الساعة 2 صباحًا
- كل أسبوع مرة
زي فكرة الـ Linux Cron Jobs بالضبط، لكن داخل تطبيق Java نفسه.
⚙️ كيف تفعّلها في Spring Boot
1. فعّل الـ Scheduling
أضف الأنوتيشن دي في الكلاس الأساسي بتاعك:
@SpringBootApplication {
@EnableScheduling
public class MyApp public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
2. أنشئ ميثود فيها الكود اللي عايز يتنفذ
@Component {
public class CronTasks @Scheduled(cron = "0 0/5 * * * *") // كل 5 دقايق {
public void runTask() System.out.println("Task running at " + LocalDateTime.now());
}
}
⏳ شرح صيغة الـ cron
الـ cron expression بيتكون من 6 أو 7 أجزاء:
second minute hour day-of-month month day-of-week [year]
📘 أمثلة شائعة:
| المهمة | التعبير | المعنى |
|---|---|---|
| كل دقيقة | 0 * * * * * | كل دقيقة بالضبط |
| كل 5 دقايق | 0 0/5 * * * * | كل 5 دقائق |
| كل ساعة | 0 0 * * * * | أول كل ساعة |
| كل يوم 2 صباحًا | 0 0 2 * * * | كل يوم الساعة 2:00 |
| كل يوم اثنين 9 صباحًا | 0 0 9 * * MON | يوم الاثنين الساعة 9 |
| كل أول يوم في الشهر | 0 0 0 1 * * | أول يوم في الشهر في منتصف الليل |
💡 ممكن تستخدم تعبير أبسط لو مش عايز cron
زي:
@Scheduled(fixedRate = 10000) // كل 10 ثواني
@Scheduled(fixedDelay = 10000) // بعد ما المهمة تخلص بـ 10 ثواني
fixedRate: يبدأ المهمة كل فترة محددة بغض النظر إن السابقة خلصت أو لا.fixedDelay: ينتظر حتى تنتهي السابقة ثم يبدأ الجديدة بعد التأخير المحدد.
🧩 مميزات Spring Cron Job
- 🔁 تشغيل تلقائي داخل التطبيق
- مش محتاج تكتب سكريبتات خارجية ولا تعتمد على Linux crontab.
- ⚙️ تكامل كامل مع Spring
- تقدر تستخدم Beans, Services, وRepositories داخل المهام.
- 🧠 جدولة مرنة جدًا
- باستخدام cron expressions أو fixed rates.
- 💥 Thread Management تلقائي
- Spring بيشغل المهام في خلفية التطبيق بشكل منظم.
- 🧾 سهلة المراقبة والتحكم
- تقدر تسجل وقت التشغيل والـ logs بسهولة.
- 📈 إمكانية تشغيل أكثر من Job
- بس تضيف أكثر من ميثود عليها
@Scheduled.
- بس تضيف أكثر من ميثود عليها
📘 مثال متكامل
@Service {
public class ReportScheduler // كل يوم الساعة 3 صباحًا {
@Scheduled(cron = "0 0 3 * * *")
public void generateDailyReport() System.out.println("Generating daily report at " + LocalDateTime.now()); // Logic: generate report, send email, etc.
}
}
🚀 نصيحة احترافية
لو عندك أكثر من مهمة مجدولة، استخدم:
@EnableAsync
@EnableScheduling
ثم:
@Async { … }
@Scheduled(cron = "0 0 2 * * *")
public void jobOne()@Async { … }
@Scheduled(cron = "0 0 3 * * *")
public void jobTwo()
عشان المهام تشتغل بالتوازي بدون ما توقف بعضها.