/* Déclarations Globales */
DCL VAR(&HEURE) TYPE(*CHAR) LEN(6)
DCL VAR(&HEURE_TRT) TYPE(*CHAR) LEN(6) VALUE('000000')
/* Traitement */
BOUCLE: RTVSYSVAL SYSVAL(QTIME) RTNVAR(&HEURE)
/* Fin du traitement à 17h30 - a ajuster */
IF COND(&HEURE *GT '173000') THEN(GOTO CMDLBL(FIN))
/* Toutes les 5 minutes */
IF COND(%INT(&HEURE) *GE (%INT(&HEURE_TRT) + 500)) THEN(DO)
/* Lancement Pgm 1 */
SBMJOB CMD(CALL PGM1) JOB(PGM1)
MONMSG MSGID(CPF0000)
/* Lancement Pgm 2 */
SBMJOB CMD(CALL PGM2) JOB(PGM2)
MONMSG MSGID(CPF0000)
/* Affectation de l'heure de traitement de référence */
CHGVAR VAR(&HEURE_TRT) VALUE(&HEURE)
ENDDO
/* Lecture suivante */
GOTO CMDLBL(BOUCLE)
FIN:
ENDPGM
Le problème est que le CL prends beaucoup de CPU en fin de journée (Environ 25 %), est-ce qu'il y existe un moyen de faire autrement (hors AJS...)? Je pensais passer par une DTAQ mais écrire dedans toutes les 5 minutes reviendrai au même non ?
Une solution, créer le poste du WRKJOBSCDE en *ONCE et SAVE(*YES).
A chaque fois que le CL se lance, il faut calculer 5mn en plus que le temps présent et modifier le poste du wrkjobscde. (CHGJOBSCDE)
A la fin de la la période, il faut remettre la date du lendemain avec l'heure du début.
à la suite du lancement de PGM1 & PGM2, faire un DLYJOB de 5 mn puis ensuite, si l'heure système n'a pas dépassé la limite, faire un SBMJOB de lui même et sortir. (pas de boucle en somme)
Ou même, plutôt que de faire un DLYJOB, calculer l'heure actuelle plus 5mn, si ne dépasse pas l'heure limite, alors faire directement un SBMJOB avec le paramètre SCDTIME(<heure calculée>)
Une autre solution existe, que nous utilisons depuis des années car très efficace.
On utilise une file d'attente de message spécifique.
Dans le CL lancé par le WRKJOBSCDE on a :
Une tentative de création de la file d'attente de message MaMsgQueue (CRTMSGQ)
Une tentative d'allocation exclusive de cette file d'attente pour éviter les lancements en double (ALCOBJ)
Un vidage de la file d'attente pour éviter de traiter des demandes d'arrêt qui auraient été empilées (CLRMSGQ)
Puis une simple boucle dans laquelle on a placé une réception de message :
Ainsi, il suffit d'envoyer un message à la file d'attente pour activer le programme à la demande (si on ne veut pas avoir à attendre le NombreDeSecondes indiqué), et il suffit d'envoyer un message "FIN" pour faire quitter la boucle et arrêter le traitement centralisé.
Pas de consommation de CPU, et surtout une réaction instantanée aux demandes.