Encore Cron Jobs
Instructions
Une déclaration CronJob dans Encore.ts lie une planification à un endpoint api(...) existant. L'endpoint s'exécute à la cadence choisie. Déclarez le CronJob au niveau du package — pas à l'intérieur d'une fonction.
import { CronJob } from "encore.dev/cron";
import { api } from "encore.dev/api";
// 1. L'endpoint à appeler (généralement interne : expose: false)
export const aggregateDailyOrders = api(
{ expose: false },
async (): Promise<void> => {
// Logique d'agrégation
}
);
// 2. Déclaration cron au niveau du package
const _ = new CronJob("aggregate-daily-orders", {
title: "Aggregate orders for the previous day",
schedule: "0 2 * * *", // 02:00 UTC tous les jours
endpoint: aggregateDailyOrders,
});
Formats de planification
| Field |
Exemple |
Description |
every |
"1h", "30m", "6h" |
Intervalle simple. Doit diviser 24h de façon égale — "7h" est invalide. |
schedule |
"0 9 * * 1" |
Expression cron standard (5 champs, UTC). |
Expressions cron courantes
| Cron |
Signification |
"0 * * * *" |
Chaque heure, à l'heure pile |
"0 2 * * *" |
Quotidiennement à 02:00 UTC |
"0 0 * * 0" |
Chaque dimanche à minuit UTC |
"0 4 15 * *" |
04:00 UTC le 15 de chaque mois |
Comportement important
- Les cron jobs ne s'exécutent pas en local avec
encore run. Seuls les environnements déployés déclenchent les crons.
- L'endpoint cron doit être
expose: false pour qu'il ne puisse pas être déclenché de l'extérieur — seul le planificateur cron doit l'appeler.
- Tous les horaires dans
schedule sont en UTC. Convertissez depuis l'heure locale en concevant la planification.
- L'endpoint doit déjà exister au chargement du module — déclarez-le avant le
CronJob.
Recommandations
- Utilisez
every pour « exécuter à intervalle régulier » (doit diviser 24h).
- Utilisez
schedule pour des heures spécifiques de la journée ou des jours de la semaine.
- Gardez la logique de l'endpoint idempotente : un cron peut s'exécuter en retard ou être relancé lors d'un redéploiement.
- Pour du travail en arrière-plan piloté par événements (non piloté par le temps), utilisez plutôt la skill
encore-pubsub.