Um JOBGROUP torna visíveis ao JES2 um conjunto de jobs relacionados e as respetivas regras de sequenciamento como um único objeto de orquestração. Em vez de pedir a cada job que descubra as suas próprias dependências, define-se primeiro a orquestração e depois associam-se os jobs reais a esse grupo.
Este artigo é deliberadamente prático. Define um pequeno JOBGROUP, submete os jobs associados no mesmo input stream e valida um fluxo simples:
JGAexecuta primeiroJGBeJGCexecutam depois deJGAJGDexecuta apenas depois deJGBeJGC
1. Objetivos do laboratório
No fim do laboratório deverá ser capaz de:
- Explicar o que é um
JOBGROUPJES2 - Distinguir
JOBGROUPdeSCHEDULE AFTER/BEFORE/DELAY=YES - Definir um grupo de jobs nativo com
GJOBeAFTER - Associar jobs ao grupo com
SCHEDULE JOBGROUP=... - Compreender as principais restrições do bloco de definição do grupo
2. Ambiente necessário
Para este laboratório, necessita:
- z/OS 2.2 ou posterior
- JES2
- Acesso TSO/ISPF com permissão para submeter jobs encadeados
- Acesso SDSF, ou um monitor equivalente para estados de jobs e de grupos de jobs JES2
Pré-requisitos importantes:
- Os grupos de jobs JES2 têm de estar configurados e ativos ao nível do sistema (JES2
GRPDEF) - A instalação tem de estar no modo de ativação JES2 exigido para grupos de jobs. Todos os membros têm de estar a executar z/OS 2.2 ou posterior para o modo de ativação exigido
Se o laboratório falhar logo no momento da submissão com erros JES2 de grupo de jobs, peça ao programador de sistema para verificar a ativação dos grupos de jobs antes de continuar.
3. O que JOBGROUP lhe dá
Um grupo de jobs JES2 é uma definição nativa de orquestração dentro do input stream submetido. Descreve:
- Os jobs que pertencem ao grupo
- As regras de dependência entre eles
- O objeto global de orquestração que o JES2 monitoriza
As instruções principais são:
| Instrução | Finalidade |
|---|---|
JOBGROUP | Inicia a definição do grupo de jobs |
GJOB | Define um job dentro do grupo |
JOBSET | Define um conjunto nomeado de jobs |
SJOB | Define um job dentro de um conjunto de jobs |
AFTER | Indica que o job ou conjunto atual deve esperar por outro job ou conjunto |
BEFORE | Indica que o job ou conjunto atual deve preceder outro job ou conjunto |
CONCURRENT | Indica que os jobs devem executar ao mesmo tempo |
ENDSET | Termina a definição de um conjunto de jobs |
ENDGROUP | Termina a definição do grupo de jobs |
Para associar um job submetido a um grupo de jobs, o próprio job usa:
// SCHEDULE JOBGROUP=group-name4. Porque é que JOBGROUP é mais forte do que o sequenciamento dinâmico leve
No modelo SCHEDULE AFTER/BEFORE/DELAY=YES, cada job descobre dinamicamente as suas dependências à medida que jobs entram e saem do JES2. Isso é útil, mas há que ter alguns cuidados operacionais devido à forma como é implementado pelo JES2 (a dependência é resolvida de forma distribuída e dinâmica, job a job, com base no estado corrente das filas JES2).
JOBGROUP altera o modelo:
- O objeto de orquestração é criado primeiro
- Os jobs registam-se nesse grupo
- O JES2 controla o fluxo a partir da própria definição do grupo
É por isso que a IBM refere explicitamente que JOBGROUP evita os problemas observados no sequenciamento dinâmico leve (modelo SCHEDULE AFTER/BEFORE/DELAY=YES).
5. Restrições importantes antes de codificar o laboratório
O bloco do grupo de jobs não é JCL comum. Existem várias restrições:
- Apenas são permitidas instruções de controlo de execução JES2 entre
JOBGROUPeENDGROUP - Não são permitidas instruções JECL como
/*... - Não são permitidos dados instream
- Não são permitidos símbolos
- Não são permitidas instruções normais
JOB,EXECouDDdentro do próprio bloco de definição do grupo
Os jobs batch reais vêm depois da definição do grupo e são associados ao mesmo com SCHEDULE JOBGROUP=....
6. A orquestração que vamos construir
Este laboratório usa o seguinte grafo nativo de dependências:
JGA
├── JGB
└── JGC
└──
JGDMais precisamente:
JGBexecuta depois deJGAJGCexecuta depois deJGAJGDexecuta depois deJGBeJGC
Os próprios jobs vão executar ações simples sobre data sets para que possa validar que a sequência aconteceu realmente.
7. Criar o input stream completo
Crie um membro como JGLAB com o seguinte conteúdo:
//MYJG JOBGROUP
//JGA GJOB
//JGB GJOB
// AFTER NAME=JGA,WHEN=(RC=0)
//JGC GJOB
// AFTER NAME=JGA,WHEN=(RC=0)
//JGD GJOB
// AFTER NAME=(JGB,JGC)
//MYJGD ENDGROUP
//*
//JGA JOB ,'JOBGROUP LAB',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
// SCHEDULE JOBGROUP=MYJG
//STEP1 EXEC PGM=IEFBR14
//OUTA DD DSN=&SYSUID..JGDEMO.A,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1,1)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
//*
//JGB JOB ,'JOBGROUP LAB',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
// SCHEDULE JOBGROUP=MYJG
//STEP1 EXEC PGM=IEFBR14
//OUTB DD DSN=&SYSUID..JGDEMO.B,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1,1)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
//*
//JGC JOB ,'JOBGROUP LAB',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
// SCHEDULE JOBGROUP=MYJG
//STEP1 EXEC PGM=IEFBR14
//OUTC DD DSN=&SYSUID..JGDEMO.C,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1,1)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
//*
//JGD JOB ,'JOBGROUP LAB',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
// SCHEDULE JOBGROUP=MYJG
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DELETE '&SYSUID..JGDEMO.A'
IF LASTCC = 8 THEN SET MAXCC = 0
DELETE '&SYSUID..JGDEMO.B'
IF LASTCC = 8 THEN SET MAXCC = 0
DELETE '&SYSUID..JGDEMO.C'
IF LASTCC = 8 THEN SET MAXCC = 0
/*Submeta o membro uma única vez para que a definição do grupo de jobs e os jobs associados entrem no JES2 em conjunto.
8. O que observar após a submissão
No SDSF, ou no seu monitor JES2 equivalente, procure:
- Os quatro jobs
JGA,JGB,JGCeJGD - A objeto de grupo de jobs
JGDEMO - A ordem de execução
Comportamento esperado:
JGAtorna-se elegível primeiroJGBeJGCmantêm-se dependentes deJGAJGDmantém-se dependente deJGBeJGC- Depois de
JGAterminar comRC=0,JGBeJGCtornam-se elegíveis - Depois de ambos terminarem,
JGDtorna-se elegível
Resultado funcional esperado:
JGA,JGB,JGCeJGDterminam normalmenteJGDelimina os três data sets criados pelos jobs anteriores
Isto confirma que o sequenciamento do grupo foi imposto corretamente.
9. Porque é que a condição WHEN=(RC=0) é importante
A dependência de JGA para JGB e JGC não é apenas “depois de JGA”. É:
AFTER NAME=JGA,WHEN=(RC=0)Isto significa que a dependência só fica satisfeita quando JGA termina com RC=0.
Este é o valor prático:
- Pode construir regras de orquestração baseadas na qualidade da conclusão
- Um job pai que termina mal não tem de libertar o resto do fluxo
Em desenhos de grupos maiores, é aqui que WHEN=, ACTION= e OTHERWISE= se tornam operacionalmente importantes.
10. Onde entra JOBSET
Este laboratório usa apenas GJOB porque é a forma mais simples de introduzir a função, mas JOBSET é a próxima capacidade a aprender quando o grafo começa a crescer.
O objetivo de JOBSET é permitir tratar vários jobs como uma única unidade de orquestração nomeada dentro do grupo de jobs. Em vez de escrever dependências contra jobs individuais um a um, define-se um conjunto e depois refere-se esse conjunto pelo seu nome.
Na prática, JOBSET é útil quando:
- Vários jobs pertencem à mesma fase lógica do fluxo
- Um sucessor deve esperar por um conjunto completo de jobs, e não apenas por um único job
- Quer que o modelo de dependências descreva fases de negócio e não apenas jobs isolados
- Quer que o comportamento de flush seja controlado ao nível do conjunto com
FLUSHTYP
Pense na distinção desta forma:
| Construção | Melhor utilização |
|---|---|
GJOB | Um pequeno grafo direto em que cada job é referenciado individualmente |
JOBSET + SJOB | Um fluxo maior em que vários jobs devem ser tratados como uma fase nomeada |
10.1 Que problema JOBSET resolve
Suponha que tem três jobs de extração:
EXTAEXTBEXTC
e depois um job de consolidação:
LOAD1
Sem JOBSET, a dependência é expressa job a job:
//LOAD1 GJOB
// AFTER NAME=(EXTA,EXTB,EXTC)Isto continua a ser válido, mas a intenção fica apenas implícita. O JES2 vê três jobs pais individuais, não uma fase nomeada.
Com JOBSET, pode modelar essa fase explicitamente:
//EXTRSET JOBSET
//EXTA SJOB
//EXTB SJOB
//EXTC SJOB
//EXTRSET ENDSET
//LOAD1 GJOB
// AFTER NAME=EXTRSETAgora a dependência lê-se de forma mais natural:
- Primeiro o conjunto de extração
- Depois o job de carga
Esse é o principal valor de JOBSET: uma estrutura de orquestração mais clara.
10.2 Quando JOBSET é mais útil do que GJOB
JOBSET torna-se útil quando o grafo deixa de ser “apenas alguns jobs” e começa a ter fases reutilizáveis ou reconhecíveis.
Exemplos típicos:
- Uma fase de extração paralela seguida por uma fase de merge
- Vários jobs de validação seguidos por um job de publicação
- Uma família de jobs regionais seguida por um resumo global
- Um conjunto de jobs preparatórios que têm todos de terminar antes de a fase seguinte começar
Nesse ponto, JOBSET melhora a legibilidade porque:
- A lista de dependências fica mais curta
- A definição do grupo começa a refletir melhor as fases reais do processo
- A manutenção posterior fica mais fácil quando é necessário acrescentar um novo job ao conjunto
10.3 Porque é que FLUSHTYP importa
JOBSET também introduz uma capacidade importante que GJOB simples não oferece de forma tão limpa: semântica de flush ao nível do conjunto.
A IBM documenta FLUSHTYP em JOBSET como:
ALLFLUSHANYFLUSH
Isto controla o que acontece aos jobs do conjunto quando os jobs pais são flushed.
Significado prático:
ALLFLUSH: faz flush a um job do conjunto apenas se todos os jobs pais forem flushedANYFLUSH: faz flush a um job do conjunto se qualquer job pai for flushed
Isto importa quando o conjunto representa uma fase real e precisa de comportamento coerente de falha ou bypass para toda a fase.
10.4 Regra prática de bolso
Use GJOB quando:
- O grafo é pequeno
- As dependências job a job continuam fáceis de ler
- Está a introduzir a função pela primeira vez
Use JOBSET quando:
- Vários jobs formam uma única fase lógica
- Um job posterior depende da fase como um todo
- Precisa de comportamento de flush ao nível do conjunto
- A orquestração começa a ficar difícil de ler como uma lista plana de nomes
GJOB
11. Como isto difere das capacidades básicas de scheduling
As capacidades básicas de scheduling cobrem:
HOLDUNTLAFTERBEFOREDELAY=YES
Continuam a ser úteis, mas funcionam como controlos mais leves de scheduling por job.
Os grupos de jobs são diferentes:
- O objeto de orquestração existe primeiro como
JOBGROUP - Os jobs associam-se depois com
SCHEDULE JOBGROUP=... - O JES2 gere a rede de dependências a partir dessa definição nativa do grupo
11. Cleanup
Nesta versão do laboratório não é necessário um job adicional de cleanup. O job final JGD já remove os três data sets criados por JGA, JGB e JGC.
Se quiser repetir o laboratório imediatamente após uma execução bem-sucedida, é mais seguro criar uma segunda variante do membro com um nome JOBGROUP diferente e nomes de job diferentes, porque o JES2 pode ainda reter durante algum tempo os metadados do grupo anterior.
Resumo
Se precisar de orquestração nativa dentro do JES2, JOBGROUP é a resposta mais forte.
O padrão prático é:
1. definir primeiro a orquestração com JOBGROUP, GJOB, AFTER e instruções relacionadas 2. submeter os jobs reais com:
// SCHEDULE JOBGROUP=group-nameIsto dá ao JES2 um grafo nativo de dependências em vez de pedir a cada job que descubra dinamicamente as suas próprias dependências.