viernes, 25 de marzo de 2011

Monitorear Status de Job Sometido PARTE I (WRKACTJOB *PRINT)


Muchas veces hay procesos batch que tenemos ejecutando en el sistema y que queremos monitorear de manera automática. Es decir, si el job se encuentra en MSGW, LCKW, etc. Se pueda cancelar y lanzar nuevamente.



En esta primera parte lo hacemos de manera “artesanal” por decirlo de alguna manera.


A continuación el programa CL que será sometido para monitorear el Job.


Parametros:
Jobname = Nombre del Job a monitorear
Sbsname = Subsistema donde se encuentra ejecutando el Job

             PGM        PARM(&JOBNAME &SBSNAME)                       
             DCL        VAR(&JOBNAME) TYPE(*CHAR) LEN(10)             
             DCL        VAR(&SBSNAME) TYPE(*CHAR) LEN(10)             
                                                                      
/* Datos de trabajo actual */                                         
             DCL        VAR(&NROJOB) TYPE(*CHAR) LEN(6)               
             DCL        VAR(&NAMJOB) TYPE(*CHAR) LEN(10)              
             DCL        VAR(&USRJOB) TYPE(*CHAR) LEN(10)              
                                                                      
             DCLF       FILE(QTEMP/PLANO)                             
                                                                       
             RTVJOBA    JOB(&NAMJOB) USER(&USRJOB) NBR(&NROJOB)       
                                                                      
             DLTF       FILE(QTEMP/PLANO)                              
             MONMSG     MSGID(CPF0000)                                
             CRTPF      FILE(QTEMP/PLANO) RCDLEN(132)                 

/* La pantalla del comando WrkActJob se deposita en archivo */
                                                                      
             WRKACTJOB  OUTPUT(*PRINT) SBS(&SBSNAME)                  
             CPYSPLF    FILE(QPDSPAJB) TOFILE(QTEMP/PLANO) +          
                          JOB(&NROJOB/&USRJOB/&NAMJOB) SPLNBR(*LAST)  
             DLTSPLF    FILE(QPDSPAJB) JOB(&NROJOB/&USRJOB/&NAMJOB) + 
                          SPLNBR(*LAST)                               
LOOP:       RCVF   
                                                  
             MONMSG     MSGID(CPF0864) EXEC(DO)                        
                        DLYJOB     DLY(60)                             
                        TFRCTL     PGM(MONITOR) PARM(&JOBNAME &SBSNAME)
             ENDDO                                                     
/* Si el job esta en MSGW se finaliza y somete nuevamente */
                                                                        
             IF         COND(%SST(&PLANO 4 10) *EQ &JOBNAME *AND +     
                          %SST(&PLANO 111 4) *EQ 'MSGW') THEN(DO)      
                                                                       
             CHGVAR     VAR(&NAMJOB) VALUE(%SST(&PLANO 04 10))         
             CHGVAR     VAR(&USRJOB) VALUE(%SST(&PLANO 17 10))         
             CHGVAR     VAR(&NROJOB) VALUE(%SST(&PLANO 29 06))         
                                                                       
             ENDJOB     JOB(&NROJOB/&USRJOB/&NAMJOB) OPTION(*IMMED) +  
                          DELAY(1)                                     
                                                                        
             DLYJOB     DLY(120)                                       
                                                                       
             SBMJOB     CMD(CALL PGM(MILIBRERIA/MIPROGRAMA)) +          
                          JOB(&JOBNAME) JOBQ(&SBSNAME)                 
             ENDDO                                                     
                                                                       
             GOTO       CMDLBL(LOOP)                                    

             ENDPGM                                                    

2 cosas importantes:
-       Luego de finalizar el job espero 2 minutos para estar seguro que el Job finalizó antes de someterlo nuevamente, puesto que a veces se demora en generar el joblog, cerrar los programas de servicio, etc. Esto es para evitar posibles bloqueos de archivos u otro tipo de objetos.
-       Al finalizar la lectura del archivo plano que contiene información del comando WRKACTJOB *PRINT, se realiza la llamada recursiva al programa con el comando TFRCTL, esto permite que entre en un bucle infinito, pero controlado por un DLYJOB de 1 minuto.

Al ejecutar el comando WRKACTJOB OUTPUT(*PRINT) SBS(QBATCH2) obtendremos el siguiente reporte en el spool.


Archivo QPDSPAJB



1 comentario:

  1. necesito conocer lo siguiente: como saber cuando un trabajo está en status RUN pero ya lleva más de 1 minutos o más activo. gracias, mandar ejemplo a jorgeb@prodigy.net.mx

    ResponderEliminar