Tâches parallèles et nouvelles tentatives
Réglez l’exécution en parallèle, les nouvelles tentatives, les délais et le comportement après un échec.
Dans cet exemple, flaky et lint démarrent en parallèle. La première tâche échoue une fois, attend 100 ms et réussit à la tentative suivante. Son entrée dans result.tasks indique alors attempts: 2.
Exécuter des tâches en parallèle
Section intitulée « Exécuter des tâches en parallèle »start({ concurrency }) fixe le nombre de tâches exécutées en même temps. La valeur par défaut est 1 : les tâches s’enchaînent une par une. Une tâche attend toujours chaque tâche de sa liste after.
Relancer une tâche en échec
Section intitulée « Relancer une tâche en échec »Une tâche s’exécute une seule fois, sauf si vous lui donnez une politique retry.
Référence API : WorkflowOptions.
Chaque relance émet un événement retry avec son delayMs (voir Suivre la progression). Les relances comptent dans budget.attempts si vous fixez un budget.
Respecter Retry-After
Section intitulée « Respecter Retry-After »Les fournisseurs de modèles recopient un en-tête Retry-After valide dans OutpostError.details.retryAfterMs. La relance attend alors au moins cette durée, même au-delà de maxDelayMs et quel que soit le jitter. Votre propre code obtient le même comportement en levant une OutpostError avec details.retryAfterMs en millisecondes.
Fixer des délais
Section intitulée « Fixer des délais »Référence API : TaskOptions et DispatchOptions.
Définissez des délais distincts pour chaque tentative et pour l’ensemble du workflow. Dans cet exemple, la première tentative expire après 200 ms et le délai du workflow interrompt la suivante à 300 ms.
La première tentative expire après 200 ms, la seconde est annulée par l’échéance du workflow à 300 ms. Les deux valeurs sont des entiers positifs d’au plus 2 147 483 647 ms. Chaque start() de reprise reçoit une nouvelle échéance ; le temps écoulé entre deux appels ne compte pas.
Choisir ce qu’un échec arrête
Section intitulée « Choisir ce qu’un échec arrête »Une tâche échoue quand sa dernière tentative échoue. La suite dépend de stopOnError.
| Autres tâches | stopOnError: true (défaut) | stopOnError: false |
|---|---|---|
| En cours | Leur signal est interrompu ; elles finissent cancelled. | Continuent. |
| Pas démarrées | Finissent cancelled. | Les dépendantes de la tâche en échec finissent skipped ; les autres s’exécutent. |
status du workflow | "failed" | "failed" |
unwrap() lève une WorkflowFailure sauf si status vaut "done". Lisez result.tasks pour le status, les attempts et l’error de chaque tâche, et result.errors pour les échecs eux-mêmes.
Sauter une tâche avec une condition
Section intitulée « Sauter une tâche avec une condition »condition s’exécute une fois, avant la première tentative. Si elle renvoie false, la tâche finit skipped, tout comme les tâches qui en dépendent.
Une tâche sautée n’a pas de valeur : result.value(tests) lève une exception.
Annuler une exécution
Section intitulée « Annuler une exécution »Passez un AbortSignal dans start({ signal }). Il interrompt le context.signal de chaque tâche en cours, et le workflow se termine avec status: "cancelled".
Les tâches d’agent, de commande et isolées transmettent context.signal pour vous. Dans defineTask(), passez-le à chaque commande, requête et attente que lance votre code.
- L’annulation est coopérative : un code qui ignore
context.signalcontinue jusqu’à son retour, même au-delà de l’échéance du workflow ; sa valeur est alors ignorée. - Une relance réexécute toute la tâche et peut répéter ses effets de bord. Dédupliquez-les avec
context.idempotencyKey, identique d’une relance à l’autre : voir Files de jobs et workers. - Chaque appel à
start(), comme une reprise depuis un checkpoint ou après une pause sur quota, accorde de nouveauretry.attemptset fait repartir le backoff dedelayMs; les numéros de tentative restent cumulés dans un checkpoint. - Avec les pauses sur quota, une erreur de quota met la tâche en pause au lieu de la relancer.
- Les réglages de relance, les délais de tâche et la présence d’une condition font partie de l’identité du checkpoint : les modifier fait rejeter un checkpoint existant (voir Exécutions durables).
API : defineTask · Retry · TaskOptions · WorkflowOptions · WorkflowResult · OutpostError