Panoramica

È possibile eseguire un Scheduler in modo concorrente con il Server per gestire attività periodicamente. Il Scheduler aggiungerà periodicamente attività alla coda, che verranno quindi eseguite dai server worker disponibili nel cluster.

È necessario garantire che venga eseguito un solo Scheduler per ogni pianificazione per evitare attività duplicate. Utilizzare un approccio centralizzato significa che la sincronizzazione non è necessaria e il servizio può funzionare senza l'utilizzo di lock.

Se è necessario aggiungere e rimuovere dinamicamente attività periodiche, utilizzare PeriodicTaskManager anziché utilizzare direttamente il Scheduler. Consultare questa pagina wiki per informazioni più dettagliate.

Fuso Orario

Per impostazione predefinita, le attività periodiche utilizzano l'orario UTC, ma è possibile utilizzare SchedulerOpts per modificare il fuso orario utilizzato.

// Ad esempio, utilizzare il fuso orario America/Los_Angeles anziché l'orario UTC predefinito.
loc, err := time.LoadLocation("America/Los_Angeles")
if err != nil {
    panic(err)
}
scheduler := asynq.NewScheduler(
    redisConnOpt, 
    &asynq.SchedulerOpts{
        Location: loc,
    },
)

Registrazione dell'Attività

Per aggiungere periodicamente attività alla coda, è necessario registrare un record di attività con il Scheduler.

scheduler := asynq.NewScheduler(redisConnOpt, nil)

task := asynq.NewTask("esempio_attività", nil)

// È possibile utilizzare una stringa di specifica cron per specificare la pianificazione.
entryID, err := scheduler.Register("* * * * *", task)
if err != nil {
    log.Fatal(err)
}
log.Printf("registrato un'entrata: %q\n", entryID)

// È anche possibile utilizzare "@every " per specificare gli intervalli.
entryID, err = scheduler.Register("@every 30s", task)
if err != nil {
    log.Fatal(err)
}
log.Printf("registrato un'entrata: %q\n", entryID)

// È anche possibile passare delle opzioni.
entryID, err = scheduler.Register("@every 24h", task, asynq.Queue("mialacoda"))
if err != nil {
    log.Fatal(err)
}
log.Printf("registrato un'entrata: %q\n", entryID)

Esecuzione del Scheduler

Per avviare il Scheduler, chiamare Run sul Scheduler.

scheduler := asynq.NewScheduler(redisConnOpt, nil)

// ... Registra le attività

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

Chiamare Run attenderà il segnale TERM o INT (ad esempio, Ctrl-C).

Gestione degli Errori

È possibile fornire una funzione gestore per gestire gli errori se il Scheduler non riesce ad accodare le attività.

func handleEnqueueError(task *asynq.Task, opts []asynq.Option, err error) {
    // La tua logica di gestione degli errori
}

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

Controllo tramite CLI

Il CLI ha un sottocomando chiamato cron per controllare i record del Scheduler.

Per visualizzare tutti i record del Scheduler in esecuzione, è possibile eseguire il seguente comando:

asynq cron ls

Questo comando produrrà un elenco contenente l'ID, la specifica della pianificazione, il prossimo tempo di accodamento e l'ultimo tempo di accodamento per ciascun record.

È anche possibile eseguire il seguente comando per visualizzare la cronologia di ciascun record:

asynq cron history