نظرة عامة

يمكنك تشغيل "مجدول" بشكل متزامن مع "الخادم" للتعامل مع المهام بشكل دوري. سيقوم المجدول بإضافة مهام بشكل دوري إلى الصف، التي ستُنفذ بواسطة خوادم العمال المتاحة في المجموعة.

يجب ضمان تشغيل مجدول واحد فقط لكل جدول زمني لتجنب تكرار المهام. باستخدام نهج مركزي يعني أن التزامن غير ضروري، ويمكن للخدمة أن تعمل دون استخدام الأقفال.

إذا كنت بحاجة إلى إضافة وإزالة مهام دورية بشكل ديناميكي، استخدم "مدير المهام الدورية" بدلاً من استخدام "المجدول" مباشرة. انظر هذه الويكي لمزيد من المعلومات التفصيلية.

المنطقة الزمنية

بشكل افتراضي، تستخدم المهام الدورية التوقيت العالمي المنسق (UTC)، ولكن يمكنك استخدام "خيارات المجدول" لتغيير المنطقة الزمنية المستخدمة.

// كمثال، استخدم منطقة زمنية America/Los_Angeles بدلاً من منطقة الوقت الافتراضية UTC.
loc, err := time.LoadLocation("America/Los_Angeles")
if err != nil {
    panic(err)
}
scheduler := asynq.NewScheduler(
    redisConnOpt, 
    &asynq.SchedulerOpts{
        Location: loc,
    },
)

تسجيل المهمة

لإضافة مهام بشكل دوري إلى الصف، يجب عليك تسجيل سجل مهمة مع المجدول.

scheduler := asynq.NewScheduler(redisConnOpt, nil)

task := asynq.NewTask("example_task", nil)

// يمكنك استخدام سلسلة المواصفات cron لتحديد الجدول الزمني.
entryID, err := scheduler.Register("* * * * *", task)
if err != nil {
    log.Fatal(err)
}
log.Printf("تم تسجيل إدخال: %q\n", entryID)

// يمكنك أيضًا استخدام "@every " لتحديد الفواصل الزمنية.
entryID, err = scheduler.Register("@every 30s", task)
if err != nil {
    log.Fatal(err)
}
log.Printf("تم تسجيل إدخال: %q\n", entryID)

// يمكنك أيضًا تمرير خيارات.
entryID, err = scheduler.Register("@every 24h", task, asynq.Queue("myqueue"))
if err != nil {
    log.Fatal(err)
}
log.Printf("تم تسجيل إدخال: %q\n", entryID)

تشغيل المجدول

لبدء المجدول، ادعو Run على المجدول.

scheduler := asynq.NewScheduler(redisConnOpt, nil)

// ... تسجيل المهام

if err := scheduler.Run(); err != nil {
    log.Fatal(err)
}

سيقوم استدعاء Run بانتظار إشارة TERM أو INT (على سبيل المثال، Ctrl-C).

التعامل مع الأخطاء

يمكنك توفير دالة معالجة للتعامل مع الأخطاء إذا فشل المجدول في إضافة مهام إلى الصف.

func handleEnqueueError(task *asynq.Task, opts []asynq.Option, err error) {
    // منطقية التعامل مع الأخطاء الخاصة بك
}

scheduler := asynq.NewScheduler(
    redisConnOpt, 
    &asynq.SchedulerOpts{
        EnqueueErrorHandler: handleEnqueueError,
    },
)

التحقق عبر واجهة سطر الأوامر (CLI)

تحتوي واجهة سطر الأوامر (CLI) على فرع فرعي يسمى "cron" للتحقق من سجلات المجدول.

لعرض جميع السجلات الخاصة بالمجدول الجاري بشكل افتراضي، يمكنك تشغيل الأمر التالي:

asynq cron ls

سيقوم هذا الأمر بإخراج قائمة تحتوي على معرّف الهوية (ID)، مواصفة الجدول الزمني، الوقت القادم لإضافة المهمة، والوقت الأخير لإضافة المهمة لكل سجل.

يمكنك أيضًا تشغيل الأمر التالي لعرض تاريخ كل سجل:

asynq cron history