Planification de Travaux - temps d'UC

RPG (3 et 4, free), CL, SQL, etc...
Répondre
Jean-Marie
Messages : 30
Enregistré le : lun. 02 nov. 2015, 17:21:20

Planification de Travaux - temps d'UC

Message par Jean-Marie »

Bonjour,

Le but est de soumettre des travaux toutes les n minutes, pour cela un CL est lancé un fois par jour depuis le planificateur ibm i :

Code : Tout sélectionner

                       
/* 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 ?

Cordialement,
Jean-Marie

bvaron
Messages : 9
Enregistré le : jeu. 08 oct. 2020, 07:24:50

Re: Planification de Travaux - temps d'UC

Message par bvaron »

Hello,

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.

Jean-Marie
Messages : 30
Enregistré le : lun. 02 nov. 2015, 17:21:20

Re: Planification de Travaux - temps d'UC

Message par Jean-Marie »

Merci pour votre réponse, je vais tester ça.

bvaron
Messages : 9
Enregistré le : jeu. 08 oct. 2020, 07:24:50

Re: Planification de Travaux - temps d'UC

Message par bvaron »

Ou alors, peut-être plus simple,

à 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>)

Jean-Marie
Messages : 30
Enregistré le : lun. 02 nov. 2015, 17:21:20

Re: Planification de Travaux - temps d'UC

Message par Jean-Marie »

Super merci, j'ai opté pour la deuxième solution, fonctionne nickel !

Hurri
Messages : 38
Enregistré le : lun. 02 nov. 2020, 16:04:59

Re: Planification de Travaux - temps d'UC

Message par Hurri »

Bonjour,

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 :

    Code : Tout sélectionner

    RCVMSG     MSGQ(MaMsgQueue) WAIT(NombreDeSecondes) MSG(VariableALire)
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.

Répondre