Przegląd

Możesz uruchomić Scheduler jednocześnie z Serwerem, aby obsługiwać zadania okresowo. Scheduler periodycznie będzie dodawał zadania do kolejki, które następnie będą wykonywane przez dostępne serwery robocze w klastrze.

Musisz upewnić się, że dla każdego harmonogramu uruchomiony jest tylko jeden Scheduler, aby uniknąć zduplikowanych zadań. Użycie podejścia scentralizowanego oznacza, że synchronizacja nie jest konieczna, a usługa może działać bez użycia blokad.

Jeśli musisz dynamicznie dodawać i usuwać zadania okresowe, użyj PeriodicTaskManager zamiast bezpośrednio korzystać z Scheduler. Zobacz ten wiki dla bardziej szczegółowych informacji.

Strefa czasowa

Domyślnie zadania okresowe korzystają ze strefy czasu UTC, ale można użyć SchedulerOpts do zmiany używanej strefy czasowej.

// Na przykład, użyj strefy czasowej America/Los_Angeles zamiast domyślnej strefy czasowej UTC.
loc, err := time.LoadLocation("America/Los_Angeles")
if err != nil {
    panic(err)
}
scheduler := asynq.NewScheduler(
    redisConnOpt, 
    &asynq.SchedulerOpts{
        Location: loc,
    },
)

Rejestracja zadania

Aby periodycznie dodawać zadania do kolejki, musisz zarejestrować rekord zadania z Schedulerem.

scheduler := asynq.NewScheduler(redisConnOpt, nil)

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

// Możesz użyć ciągu specyfikacji cron do określenia harmonogramu.
entryID, err := scheduler.Register("* * * * *", task)
if err != nil {
    log.Fatal(err)
}
log.Printf("zarejestrowano wpis: %q\n", entryID)

// Możesz także użyć "@every " do określenia interwałów.
entryID, err = scheduler.Register("@every 30s", task)
if err != nil {
    log.Fatal(err)
}
log.Printf("zarejestrowano wpis: %q\n", entryID)

// Możesz także przekazać opcje.
entryID, err = scheduler.Register("@every 24h", task, asynq.Queue("myqueue"))
if err != nil {
    log.Fatal(err)
}
log.Printf("zarejestrowano wpis: %q\n", entryID)

Uruchamianie Schedulera

Aby uruchomić Scheduler, wywołaj Run na Schedulerze.

scheduler := asynq.NewScheduler(redisConnOpt, nil)

// ... Rejestrowanie zadań

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

Wywołanie Run będzie oczekiwać na sygnał TERM lub INT (np. Ctrl-C).

Obsługa błędów

Możesz dostarczyć funkcję obsługi do obsługi błędów, jeśli Scheduler nie może umieścić zadań w kolejce.

func handleEnqueueError(task *asynq.Task, opts []asynq.Option, err error) {
    // Twoja logika obsługi błędów
}

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

Sprawdzanie za pomocą CLI

CLI ma podpolecenie o nazwie cron do sprawdzania rekordów Schedulera.

Aby wyświetlić wszystkie rekordy aktualnie działającego Schedulera, możesz wykonać poniższą komendę:

asynq cron ls

Ta komenda wyświetli listę zawierającą ID, specyfikację harmonogramu, następny czas dodania do kolejki oraz ostatni czas dodania dla każdego rekordu.

Możesz także wykonać poniższą komendę, aby wyświetlić historię każdego rekordu:

asynq cron history