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