Gambaran Umum

Anda dapat menjalankan Scheduler secara simultan dengan Server untuk menangani tugas secara berkala. Scheduler secara berkala akan menambahkan tugas ke antrian, yang kemudian akan dieksekusi oleh server pekerja yang tersedia di dalam klaster.

Anda perlu memastikan bahwa hanya satu Scheduler yang berjalan untuk setiap jadwal untuk menghindari tugas yang duplikat. Menggunakan pendekatan terpusat berarti sinkronisasi tidak diperlukan, dan layanan dapat berjalan tanpa menggunakan kunci.

Jika Anda perlu secara dinamis menambahkan dan menghapus tugas berkala, gunakan PeriodicTaskManager alih-alih langsung menggunakan Scheduler. Lihat wiki ini untuk informasi lebih detail.

Zona Waktu

Secara default, tugas berkala menggunakan waktu UTC, tetapi Anda dapat menggunakan SchedulerOpts untuk mengubah zona waktu yang digunakan.

// Sebagai contoh, gunakan zona waktu America/Los_Angeles alih-alih zona waktu UTC default.
loc, err := time.LoadLocation("America/Los_Angeles")
if err != nil {
    panic(err)
}
scheduler := asynq.NewScheduler(
    redisConnOpt, 
    &asynq.SchedulerOpts{
        Location: loc,
    },
)

Pendaftaran Tugas

Untuk secara berkala menambahkan tugas ke antrian, Anda perlu mendaftarkan catatan tugas dengan Scheduler.

scheduler := asynq.NewScheduler(redisConnOpt, nil)

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

// Anda dapat menggunakan string spesifikasi cron untuk menentukan jadwal.
entryID, err := scheduler.Register("* * * * *", task)
if err != nil {
    log.Fatal(err)
}
log.Printf("mendaftarkan entri: %q\n", entryID)

// Anda juga dapat menggunakan "@every " untuk menentukan interval.
entryID, err = scheduler.Register("@every 30s", task)
if err != nil {
    log.Fatal(err)
}
log.Printf("mendaftarkan entri: %q\n", entryID)

// Anda juga dapat melewati opsi.
entryID, err = scheduler.Register("@every 24h", task, asynq.Queue("myqueue"))
if err != nil {
    log.Fatal(err)
}
log.Printf("mendaftarkan entri: %q\n", entryID)

Menjalankan Scheduler

Untuk memulai Scheduler, panggil Run pada Scheduler.

scheduler := asynq.NewScheduler(redisConnOpt, nil)

// ... Mendaftarkan tugas

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

Memanggil Run akan menunggu sinyal TERM atau INT (misalnya, Ctrl-C).

Penanganan Error

Anda dapat menyediakan fungsi penangan untuk menangani kesalahan jika Scheduler gagal menambahkan tugas ke antrian.

func handleEnqueueError(task *asynq.Task, opts []asynq.Option, err error) {
    // Logika penanganan kesalahan Anda
}

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

Pengecekan melalui CLI

CLI memiliki sub perintah bernama cron untuk memeriksa catatan Scheduler.

Untuk melihat semua catatan untuk Scheduler yang saat ini berjalan, Anda dapat menjalankan perintah berikut:

asynq cron ls

Perintah ini akan mengeluarkan daftar yang berisi ID, spesifikasi jadwal, waktu enqueue selanjutnya, dan waktu enqueue terakhir untuk setiap catatan.

Anda juga dapat menjalankan perintah berikut untuk melihat riwayat setiap catatan:

asynq cron history