Les tâches planifiées

Un planificateur à la manière de cron. Chaque tâche est un enregistrement de la table BSPK_TASK_MANAGER ; le gestionnaire, démarré par BSPK_STARTUP et exécuté sur le serveur, vérifie les tâches environ une fois par seconde et lance celles qui sont dues. BSPK_QUIT l'arrête, avec les workers qu'il a lancés.

Une tâche

ChampRôle
nameLe nom de la tâche, qui est aussi le nom du worker dans lequel elle tourne.
method_nameLa méthode à exécuter (31 caractères au plus).
periodQuand, voir ci-dessous.
paramUn objet, passé comme unique paramètre de la méthode.
actifFaux : la tâche ne tourne jamais.
executeOnStartupExécuter une fois au démarrage, puis suivre la période.
executeOnDevEn mode DEV, seules les tâches qui ont ce drapeau tournent.
forceExécuter au prochain passage quelle que soit la période (remis à faux ensuite).
lastExecuteRenseigné par le gestionnaire.

Il n'y a ni écran ni fichier de configuration : vous ajoutez une tâche en créant l'enregistrement, une seule fois, par exemple dans une méthode de mise à jour ou au démarrage, en vérifiant d'abord qu'elle n'existe pas :

var $Task : cs.BSPK_TASK_MANAGEREntity
If (ds.BSPK_TASK_MANAGER.query("name = :1"; "EXPORT_NOCTURNE").length=0)
	$Task:=ds.BSPK_TASK_MANAGER.new()
	$Task.name:="EXPORT_NOCTURNE"
	$Task.method_name:="EXPORT_NOCTURNE"
	$Task.period:="0 0 2 * *"      // tous les jours à 02:00:00
	$Task.param:={vl_Jours: 7}
	$Task.actif:=True
	$Task.executeOnDev:=False
	$Task.executeOnStartup:=False
	$Task.save()
End if

La période

Jusqu'à cinq champs séparés par des espaces, en commençant par les secondes (ce n'est pas l'ordre du crontab Unix) :

ss  mm  hh  jj  MMM
ChampValeurs
ss (secondes)0 à 59
mm (minutes)0 à 59
hh (heures)0 à 23
jj (jour)1 à 31, ou un jour de la semaine en anglais : Monday … Sunday
MMM (mois)1 à 12

Chaque champ vaut * (n'importe quelle valeur), */x (quand la valeur est un multiple de x) ou un nombre. Un champ absent n'est pas vérifié : il vaut n'importe quelle valeur.

PériodeExécution
0 */30 * * *toutes les 30 minutes, à la seconde 0
0 5 3 * *tous les jours à 03:05:00
0 0 8 Mondaytous les lundis à 08:00:00

Comment elle s'exécute

Le gestionnaire passe par la méthode BSPH_CALL_WORKER de votre projet, qui fait CALL WORKER(name; method_name; param). Conséquences :

  • la méthode s'exécute dans le contexte de votre projet, sur le serveur : ce doit être une de vos méthodes, ou une méthode partagée du composant ;
  • un worker par nom de tâche : une exécution encore en cours retarde la suivante (les appels s'empilent dans le worker), deux exécutions de la même tâche ne tournent jamais en parallèle.

Une tâche sans method_name est ignorée, et une alerte part une fois par mail d'erreur.

Les tâches du composant

TâchePériodeRôle
BSPK_DUMP_WEBtoutes les 30 minutesrafraîchit l'instantané d'échange du site (BWEB/exchange/snapshot), sur un poste de développement seulement (présence d'un DEV_PARAMETERS) ; voir La réconciliation du contenu
BSPK_DUMP_MAINtoutes les minutesla passe rapide de la mémoire des dates, sur un poste de développement seulement
CRON_EXPORT_BSPK_HISTORYtous les jours à 03:05l'archivage de l'historique des modifications

Bon à savoir

  • Une période vide exécute la tâche à chaque passage, soit environ chaque seconde.
  • Un * dans les secondes exécute la tâche à chaque passage de la minute visée (une soixantaine de fois) : fixez la seconde (0 5 3 * *, pas * 5 3 * *).
  • Une échéance précise à la seconde peut être manquée : la vérification a lieu environ chaque seconde, et une seconde est parfois sautée. Aucun rattrapage n'a lieu.
  • */x est un multiple de la valeur, pas « toutes les x unités depuis la dernière exécution » : */7 sur les minutes déclenche à 0, 7, …, 56, puis de nouveau à 0, quatre minutes plus tard.
  • En mode DEV, une tâche sans executeOnDev ne tourne jamais, sans message.

Voir aussi