z/OS proporciona controles nativos de scheduling dentro de JES2 que muchas veces pasan desapercibidos porque muchos entornos dependen de schedulers empresariales como IBM Work Scheduler, BMC Control-M o Broadcom AutoSys Workload Automation. Esos schedulers externos son importantes, pero sigue siendo útil entender lo que JES2 puede hacer por sí mismo para jobs individuales en el job stream.
Este artículo es deliberadamente práctico. Se centra en la sentencia SCHEDULE para jobs individuales y muestra cómo:
- Mantener un job retenido hasta un momento futuro con
HOLDUNTL - Crear una dependencia simple entre jobs con
AFTER - Evitar arranques falsos en una sequenciación dinámica con
DELAY=YES
1. Objetivos del laboratorio
Al final de este laboratorio debería poder:
- Explicar qué hace la sentencia JES2
SCHEDULE - Retrasar un job hasta un momento futuro con
HOLDUNTL - Construir una secuencia simple padre-dependiente con
AFTER - Entender por qué
DELAY=YESimporta en la sequenciación dinámica - Reconocer los límites prácticos del scheduling nativo JES2
2. Entorno necesario
Para este laboratorio, use:
- z/OS 2.2 o posterior
- JES2
- Acceso TSO/ISPF con permiso para enviar y supervisar jobs batch
- Acceso SDSF, o cualquier herramienta equivalente que le permita observar los jobs enviados
Nota importante:
- La sentencia
SCHEDULEes una capacidad exclusiva de JES2 - La sentencia JES2
SCHEDULEfue introducida en z/OS 2.2, por lo quez/OS 3.1no es el nivel mínimo requerido para los ejemplos de este artículo
3. Qué puede hacer el scheduling nativo JES2
La sentencia SCHEDULE permite especificar atributos de scheduling para un job.
Para este artículo, las cláusulas más útiles son:
| Cláusula | Uso práctico |
|---|---|
HOLDUNTL | Impide que el job se vuelva elegible para ejecución hasta un momento futuro |
AFTER | Hace que un job espere hasta que otro job termine |
BEFORE | Expresa el lado inverso de una dependencia |
DELAY=YES | Indica a JES2 que un job padre o dependiente ausente debe tratarse como “todavía no está aquí”, y no como “ya ha terminado” |
El punto principal que debe retener es que estos controles afectan solo a la elegibilidad de un job para ejecución y no sustituyen a un scheduler empresarial completo, aunque son útiles para una sequenciación nativa simple.
4. Limitaciones importantes que es necesario entender
Tenga en cuenta estos puntos:
- La sentencia
SCHEDULEestá soportada por JES2, no por JES3 - Debe aparecer después de la sentencia
JOBy antes de la primeraEXECoIF - Solo se permite una sentencia
SCHEDULEen un job - La sequenciación dinámica con
BEFORE/AFTER/DELAY=YESes más ligera y más limitada que el uso de un scheduler completo
Ese último punto es importante. La sequenciación dinámica nativa es útil para relaciones pequeñas, pero no es lo mismo que un scheduler de producción completo con calendarios, lógica de restart y gestión de dependencias más rica.
5. Laboratorio 1: retrasar un job hasta un momento futuro
Este primer job muestra la capacidad útil más simple: no dejar que un job enviado se ejecute inmediatamente.
Cree un miembro como SCHHOLD1:
//SCHHOLD1 JOB ,'SCHEDULE LAB',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
// SCHEDULE HOLDUNTL='+00:02'
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
SET MAXCC=0
/*Envía el job.
Qué observar:
- El job entra inmediatamente en JES2
- Podrá verlo en la Input Queue. No se vuelve elegible para ejecución de inmediato
- Después de aproximadamente dos minutos, se libera y termina normalmente
Por qué esto importa:
- Puede enviar trabajo con antelación
- JES2 impide que el job sea seleccionado hasta la ventana temporal solicitada
Nota práctica:
'+00:02'es un intervalo temporal relativo- Para un scheduling real de mayor duración, IBM documenta también formas absolutas de fecha y hora para
HOLDUNTL
6. Qué es HOLDUNTL y qué no es
HOLDUNTL es útil cuando se quiere retrasar la elegibilidad para ejecución, pero sigue siendo muy simple y limitado en comparación con un scheduler completo.
Es bueno para:
- Aplazamientos cortos
- Liberación controlada de jobs
- Dar tiempo a que un conjunto relacionado de jobs entre en el sistema antes de que se evalúe la lógica de dependencias
No sustituye a:
- Calendarios empresariales
- Reglas de festivos
- Previsión compleja de workloads
- Cadenas de dependencias repartidas entre muchas aplicaciones y fechas de negocio
7. Laboratorio 2: una secuencia simple padre-dependiente
Ahora construiremos una pequeña secuencia de dos jobs:
JOBAcrea un data set de pruebaJOBBcomprueba que el data set existeJOBBno debe ejecutarse antes de queJOBAtermine
Cree un único miembro de input stream como SCHSEQ1 con ambos jobs:
//JOBA JOB ,'SCHEDULE LAB',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
// SCHEDULE HOLDUNTL='+00:02'
//STEP1 EXEC PGM=IEFBR14
//PARENTDD DD DSN=&SYSUID..SCHEDLAB.PARENT,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1,1)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
//*
//JOBB JOB ,'SCHEDULE LAB',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
// SCHEDULE AFTER=JOBA,DELAY=YES
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
SET MAXCC=0
/*Envíe el miembro una vez para que ambos jobs entren en JES2 casi al mismo tiempo.
Qué observar:
JOBAyJOBBentran ambos en el sistemaJOBAqueda retrasado porHOLDUNTLJOBBpermanece inelegible hasta queJOBAtermine- después de que
JOBAtermine,JOBBse ejecuta
Esto hace que la demostración sea más limpia porque la dependencia pasa a estar impulsada por AFTER=JOBA, mientras que la retención temporal se aplica solo al job padre.
Resultado funcional esperado:
JOBAtermina conCC 0000JOBBtermina conCC 0000
8. Por qué DELAY=YES importa
Este es uno de los detalles más importantes en la secuenciación nativa JES2.
IBM documenta que AFTER= por sí solo puede producir un falso positivo si el job padre no existe en ese momento. En ese caso, JES2 puede interpretar al padre como “ya se ejecutó y fue eliminado”, haciendo elegible al job dependiente.
DELAY=YES cambia ese significado:
- Sin
DELAY=YES, un job padre ausente puede interpretarse como ya completado - Con
DELAY=YES, un job padre ausente se trata como todavía no enviado
Por eso el laboratorio anterior usa:
SCHEDULE AFTER=JOBA,DELAY=YESLa combinación es deliberada:
AFTER=JOBAexpresa la dependenciaDELAY=YESevita una liberación falsa
En esta versión, HOLDUNTL se aplica solo a JOBA. Eso mantiene retrasado al job padre, al mismo tiempo que muestra que JOBB espera por causa de AFTER=JOBA. Si ambos jobs quedaran retenidos hasta la misma hora, el ejemplo dejaría de aislar el efecto de AFTER.
9. Un modelo mental útil para la secuenciación nativa
Piense en el modelo nativo JES2 de esta forma:
| Necesidad | Respuesta nativa JES2 |
|---|---|
| Retrasar un job para más tarde | HOLDUNTL |
| Expresar “ejecutar después del job X” | AFTER=X |
| Expresar “el job X tiene que terminar antes que este job” | BEFORE=X |
| Evitar tratar un job todavía no enviado como ya completado | DELAY=YES |
Esto es suficiente para una sequenciación nativa simple, pero sigue siendo intencionadamente ligera.
10. Cuándo esta es una buena elección
Estas capacidades son una buena elección cuando:
- Necesita una pequeña dependencia local sin un scheduler externo
- Quiere preparar un pequeño conjunto de jobs para liberación posterior
- Necesita una solución práctica exclusiva de JES2 para un flujo batch reducido
- Quiere un prototipo de lógica de sequenciación antes de moverla a un framework de scheduling más amplio
11. Cuándo debería usar algo más robusto
El scheduling nativo JES2 no es la mejor respuesta cuando necesita:
- Calendarios de negocio
- Cadenas largas de dependencias entre muchas aplicaciones
- Lógica robusta de restart y recovery
- Políticas de balanceo de workload en grandes streams de producción
- Auditoría central y gobierno del workload
La secuenciación dinámica con BEFORE / AFTER / DELAY=YES es menos robusta y normalmente menos eficiente que JOBGROUP.
Por eso, el mensaje práctico es:
- Use scheduling nativo JES2 para secuenciación pequeña, local y táctica
- Use construcciones de scheduler más ricas cuando el workload sea mayor o crítico para el negocio
12. Cleanup
Si quiere eliminar el data set creado por JOBA, envíe:
//SCHCLN1 JOB ,'SCHEDULE LAB',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DELETE '&SYSUID..SCHEDLAB.PARENT'
IF LASTCC = 8 THEN SET MAXCC = 0
/*Resumen
Las capacidades nativas de scheduling JES2 son simples, pero útiles.
Los dos patrones más prácticos son:
//JOB1 JOB ...
// SCHEDULE HOLDUNTL='+00:02'y:
//JOBB JOB ...
// SCHEDULE AFTER=JOBA,DELAY=YESEl primero retrasa un job hasta un momento posterior. El segundo crea una dependencia ligera y reduce el riesgo de ejecución prematura por falso positivo.
Usados con cuidado, estos controles le proporcionan una capa práctica de scheduling nativo para jobs individuales dentro de JES2 sin involucrar un scheduler externo.