Délai de la tâche

Sur cette page, je vais vous présenter comment définir le délai d'expiration ou la date limite d'une tâche, et comment gérer les opérations d'annulation.

Lors de l'ajout d'une tâche en utilisant Client, vous pouvez spécifier Timeout ou Deadline en tant qu'option. Cela permet au serveur d'abandonner la tâche et de récupérer les ressources pour d'autres tâches si la tâche n'est pas traitée avant le délai d'expiration ou la date limite. Ces options définiront le délai d'expiration ou la date limite du context.Context et le passeront en tant que premier paramètre à votre gestionnaire.

*Remarque : Le délai d'expiration est relatif au moment où le gestionnaire commence le traitement de la tâche.

Par exemple, si vous avez une tâche qui doit être terminée dans les 30 secondes, vous pouvez définir le délai à 30*time.Second.

c := asynq.NewClient(asynq.RedisClientOpt{Addr: ":6379"})

err := c.Enqueue(task, asynq.Timeout(30 * time.Second))

Si vous avez une tâche qui doit être terminée à une heure spécifique, vous pouvez définir la date limite pour la tâche.
Par exemple, si vous avez une tâche qui doit être terminée avant le 2020-12-25, vous pouvez le passer en tant qu'option Deadline.

xmas := time.Date(2020, time.December, 25, 0, 0, 0, 0, time.UTC)
err := c.Enqueue(task, asynq.Deadline(xmas))

Contexte de la tâche dans les gestionnaires

Maintenant que nous avons créé une tâche en utilisant les options Timeout et Deadline, nous devons respecter cette valeur en lisant le canal Done dans le contexte.

Le premier paramètre passé à Handler est le context.Context. Vous devriez écrire votre gestionnaire de manière à abandonner le travail après avoir reçu un signal d'annulation du contexte.

func myHandler(ctx context.Context, task *asynq.Task) error {
    c := make(chan error, 1)
    go func() {
        c <- doWork(task)
    }()
    select {
    case <-ctx.Done():
        // Signal d'annulation reçu, abandonner ce travail.
        return ctx.Err()
    case res := <-c:
        return res
    }   
}

Annulation des tâches via CLI

Le CLI asynq dispose d'une commande cancel qui peut annuler l'ID d'une tâche active.
Vous pouvez utiliser la commande workers pour vérifier les tâches actives actuellement et obtenir l'ID de la tâche à annuler.

asynq task ls --queue=myqueue --state=active
asynq task cancel [task_id]