Translate

Mostrar mensagens com a etiqueta RECEIVE MAP. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta RECEIVE MAP. Mostrar todas as mensagens

quarta-feira, 1 de julho de 2020

CICS Conversacional e Pseudo-Conversacional - Parte I

 

Bellacosa Mainframe e as tecnicas de conversação em programas CICS parte I

☕ Um Café no Bellacosa Mainframe

CICS Conversacional e Pseudo-Conversacional

Parte 1 — Das Conversas Eternas ao Modelo que Move o Mundo

"Salve, jovem Padawan Mainframe! Pegue seu café, abra uma sessão do SDSF, deixe o IPCS de prontidão e venha comigo entender uma das maiores sacadas de engenharia já criadas pela IBM. Hoje vamos falar sobre dois conceitos que sustentam boa parte das aplicações bancárias do planeta: CICS Conversacional e Pseudo-Conversacional."


O que é uma aplicação Conversacional?

Imagine que você está conversando com alguém pelo telefone.

Você liga.

A pessoa atende.

A ligação permanece aberta.

Vocês conversam.

Você pensa.

Procura um documento.

Vai tomar café.

Volta.

Continua falando.

Finalmente desliga.

Foi exatamente esta filosofia que inspirou o primeiro modelo de aplicações CICS.

Modelo Conversacional

O programa permanece residente na memória durante toda a interação com o usuário.

Visualmente:

Usuário
   │
EXEC CICS RECEIVE
   │
Programa permanece ativo
   │
Processa
   │
EXEC CICS SEND
   │
Espera usuário
   │
EXEC CICS RECEIVE
   │
Processa
   │
EXEC CICS SEND
   │
...
   │
EXEC CICS RETURN

O programa nunca sai da memória.

A task permanece viva.

A TCA continua alocada.

O TCB continua associado.

A área de trabalho permanece disponível.

Tudo fica esperando.

Inclusive o usuário.


O problema

Vamos imaginar um banco em 1982.

Existem:

5.000 terminais.

3.000 usuários.

2.000 consultas simultâneas.

Cada usuário fica parado.

Lendo a tela.

Pensando.

Conferindo CPF.

Procurando documentos.

Tomando café.

Atendendo telefone.

Conversando.

Enquanto isso...

O programa continua residente.

A task continua viva.

O CICS continua consumindo recursos.

A memória continua ocupada.


O nascimento da pseudo-conversação

Os engenheiros da IBM olharam para isso e disseram:

"Por que manter um programa carregado esperando um ser humano pensar?"

E a resposta foi brilhante.

Não vamos esperar.

Vamos embora.

Quando o usuário voltar...

Criamos outra task.

Recuperamos o estado.

Continuamos.

Nascia a pseudo-conversação.


O que é Pseudo-Conversação?

A pseudo-conversação é um modelo onde o programa não fica esperando.

Ele:

Mostra a tela.

Encerra a task.

Libera recursos.

Quando o usuário aperta ENTER...

Uma nova task é criada.

Tudo continua.

Como se nada tivesse acontecido.


Fluxo


Usuário

   │

Executa CLI1

   │

Programa COBOL

   │

SEND MAP

   │

RETURN TRANSID

COMMAREA

   │

Task termina



=====================


Usuário digita


ENTER


=====================


Nova Task


Recebe COMMAREA


RECEIVE MAP


Processa


SEND MAP


RETURN


É quase uma ilusão.

Parece conversacional.

Mas não é.

Por isso o nome:

Pseudo-Conversacional.


Comparando os dois modelos

CaracterísticaConversacionalPseudo
Task ativaSimNão
Programa residenteSimNão
Consome memóriaAltaBaixa
EscalabilidadeRuimExcelente
Usado atualmenteRaroPadrão
Ideal para milhares usuáriosNãoSim

Por que a IBM venceu?

Porque ela resolveu um problema gigantesco.

Imagine.

100 mil usuários.

Cada um esperando.

Em modelo conversacional.

Seria inviável.

No pseudo.

As tasks duram poucos milissegundos.

O usuário pensa.

Mas o mainframe trabalha em outra coisa.


Analogia moderna

Conversacional:

Você deixa o Uber esperando na porta enquanto toma banho.

Pseudo-conversacional:

Você pede outro Uber quando estiver pronto.

O custo muda completamente.


O segredo: COMMAREA

A memória da aplicação.

Entre uma task e outra.

Exemplo:


01 WS-COMM.

   05 WS-CLIENTE.

      10 WS-CODIGO PIC 9(6).

      10 WS-NOME PIC X(30).

      10 WS-PAGINA PIC 99.

      10 WS-MODO PIC X.



Primeira execução

Como descobrir?

Usando:

EIBCALEN



IF EIBCALEN = ZERO

   PERFORM PRIMEIRA-VEZ

END-IF


Primeira vez.

Sem COMMAREA.


Retorno



IF EIBCALEN > ZERO

   PERFORM RETORNO


END-IF


Existe contexto.

Usuário voltou.


Salvando estado



EXEC CICS RETURN

TRANSID('CLI1')

COMMAREA(WS-COMM)

LENGTH(100)

END-EXEC.


CICS guarda.

Task termina.

Memória liberada.


Criando nova task

Usuário aperta ENTER.

CICS cria:

Nova TCA

Nova Task

Novo TCB

Novo EIB

Mas entrega a COMMAREA.

Tudo continua.

Mágica.

Engenharia.

IBM.


O papel do BMS

Sem BMS.

Pseudo-conversação seria muito mais complicada.

Precisaríamos:

Salvar coordenadas.

Salvar cursor.

Salvar atributos.

Salvar campos.

O BMS faz tudo isso.


SEND MAP

Mostra tela.



EXEC CICS SEND MAP

MAP('TELA1')

MAPSET('CLIMAP')

ERASE

FREEKB

END-EXEC.



RECEIVE MAP

Recebe dados.



EXEC CICS RECEIVE MAP

MAP('TELA1')

MAPSET('CLIMAP')

INTO(TELA1I)

END-EXEC.



Curiosidade Bellacosa Mainframe

Muitos sistemas bancários desenvolvidos em 1985 ainda utilizam exatamente este modelo.

Mudou o hardware.

Mudou o storage.

Mudou a CPU.

Mudou a interface.

Mas a arquitetura continua.

E continua funcionando.

Talvez esta seja uma das maiores demonstrações da elegância da engenharia IBM.


Easter Egg Mainframe

Alguns desenvolvedores chamavam aplicações conversacionais de:

Programas preguiçosos.

Porque passavam a maior parte do tempo...

Esperando o usuário pensar.

Enquanto os programas pseudo-conversacionais eram apelidados de:

Programas ninja.

Aparecem.

Executam.

Desaparecem.

Voltam.

Executam.

Somem novamente.

Tudo em poucos milissegundos.


Continua...

Na Parte 2 veremos:

✔ Problemas clássicos do modelo conversacional;

✔ Deadlocks de recursos;

✔ Pseudo-conversação com múltiplas telas;

✔ COMMAREA versus Channels e Containers;

✔ Web Services no CICS;

✔ REST, SOAP e z/OS Connect;

✔ Exemplos COBOL completos;

✔ Boas práticas;

✔ Troubleshooting;

✔ Curiosidades e easter eggs pouco conhecidos do universo CICS.


sábado, 2 de maio de 2020

CICS BMS para Desenvolvedores COBOL – Parte 2

Bellacosa Mainframe apresenta a Parte II do mini curso CICS BMS


☕ Um Café no Bellacosa Mainframe

CICS BMS para Desenvolvedores COBOL – Parte 2

Da Codificação do MAPSET até a Instalação no CICS

"No primeiro artigo aprendemos a desenhar nosso primeiro mapa. Agora chegou a hora de colocá-lo em produção dentro do CICS."

Pegue seu café, abra o SDSF, reserve uma aba do JESMSGLG e vamos continuar nossa jornada.


O que produz um MAPSET?

Muitos desenvolvedores iniciantes acreditam que um mapa BMS gera apenas uma tela.

Na verdade ele produz dois artefatos distintos.

Mapa Físico

MAPSET Source
        │
Assembler
        │
        ▼
 Physical Map
        │
     DFHRPL

Exemplo

CLIENTES

É utilizado pelo CICS.


Mapa Simbólico

MAPSET Source
        │
Assembler
        │
SYSPUNCH
        │
        ▼
Symbolic Map
        │
COPYLIB

Exemplo

CLIENTEM

Será utilizado pelo COBOL.


Utilizando &SYSPARM

Muito elegante.

Ao invés de manter dois fontes.

Errado

TYPE=MAP


TYPE=DSECT

Correto

TYPE=&SYSPARM

Assembly

Mapa físico

PARM='MAP'

Mapa simbólico

PARM='DSECT'

Compilando um BMS

Etapa 1

Assembler

Etapa 2

Linkedit

Etapa 3

Instalação CICS


Exemplo JCL

Symbolic


//ASM EXEC PGM=ASMA90,
 // PARM='OBJECT,NODECK'




//SYSIN DD DSN=USER.BMS(CLIENTE)


//SYSPUNCH DD DSN=USER.COPYLIB(CLIENTE)



Physical

//ASM EXEC PGM=ASMA90




//SYSLMOD DD
DSN=CICS.LOAD(CLIENTE)




Linkedit


//LKED EXEC PGM=IEWL



//SYSLMOD DD
DSN=CICS.LOAD(CLIENTE)





Onde fica cada objeto?

ObjetoBiblioteca
Physical MapDFHRPL
Programa COBOLDFHRPL
Symbolic MapCOPYLIB
JCLPROCLIB
BMS FonteSOURCELIB

CEDA

Definir recursos.

Menu clássico.

CEDA DEF MAPSET(CLIENTE)

Exemplo

CEDA DEF MAPSET(CLIENTE)

GROUP(BANCO)

DESCRIPTION(Clientes)




INSTALL

Após definir.

Necessário instalar.

CEDA INSTALL GROUP(BANCO)

ou

CEDA INSTALL MAPSET(CLIENTE)

Verificando

Com CEMT

CEMT INQ MAPSET(CLIENTE)

Resultado

Enabled

Installed



CEMT

Comando preferido dos administradores.

Consultar

CEMT I MAPSET

Desabilitar

CEMT SET MAPSET(CLIENTE)
DISABLED

Habilitar

CEMT SET MAPSET(CLIENTE)
ENABLED

Nosso primeiro RECEIVE

Programa envia.

Usuário digita.

Programa recebe.




EXEC CICS RECEIVE

MAP('TELA01')

MAPSET('CLIENTE')

INTO(TELA01I)

END-EXEC



O EIB

Executive Interface Block

Equivale ao SQLCA.

DB2

SQLCA

CICS

EIB


DFHEIBLK

Copy automático.

Não precisa incluir.


Campos úteis.


EIBTRNID

Transação.

CLI1

EIBTRMID

Terminal.

A123

EIBTASKN

Task atual.


EIBCALEN

Comprimento da COMMAREA.

Muito importante.


EIBAID

Tecla pressionada.


DFHAID

Copybook.

COPY DFHAID.

ENTER

DFHENTER

PF3

DFHPF3

PF5

DFHPF5

PF7

DFHPF7

PF8

DFHPF8

CLEAR

DFHCLEAR

Tratando teclas



EVALUATE EIBAID


WHEN DFHENTER


PERFORM PROCESSA



WHEN DFHPF3


PERFORM SAIR




WHEN DFHPF5


PERFORM REFRESH




WHEN DFHPF7


PERFORM PAGEUP




WHEN DFHPF8


PERFORM PAGEDOWN




WHEN OTHER


PERFORM ERRO



END-EVALUATE




HANDLE AID

Muito elegante.

Instala um roteador.



EXEC CICS HANDLE AID


DFHENTER(PROC1)

DFHPF3(PROC2)

DFHPF7(PROC3)

DFHPF8(PROC4)

ANYKEY(PROC5)


END-EXEC




Pseudo Conversação

Um dos conceitos mais importantes do CICS.

Não mantemos programa residente.

Fluxo:



Usuário


↓

EXECUTA


↓

PROGRAMA


↓

SEND MAP


↓

RETURN


TRANSID


COMMAREA


↓

Task termina



==================



Usuário ENTER



==================



Nova Task


↓

RECEIVE


↓

PROCESSA


↓

SEND


↓

RETURN




EIBCALEN

Primeira execução?

Ou retorno?



IF EIBCALEN = ZERO


PERFORM PRIMEIRA-VEZ


ELSE


PERFORM RETORNO



END-IF




Primeira pseudo-conversação




IF EIBCALEN = ZERO


PERFORM MONTA-TELA


ELSE


PERFORM PROCESSA


END-IF




EXEC CICS RETURN


TRANSID('CLI1')

COMMAREA(WS-COMM)


LENGTH(100)


END-EXEC




Curiosidades Bellacosa Mainframe

Durante os anos 80 e 90 era comum encontrar MAPSETs contendo 40 ou 50 telas.

Muitos bancos utilizavam convenções curiosas:

CLI001


CLI002


CLI003


CLI999




Algumas equipes chamavam a última tela de erro de:

TELAMORTE


ABEND01


SOC4MAP


LASTMAP




Easter Egg Mainframe

Pouca gente sabe, mas muitos desenvolvedores antigos escondiam mensagens em campos DRK (Dark).

Exemplo:

DFHMDF POS=(24,1),
LENGTH=20,
ATTRB=(DRK,PROT),
INITIAL='BELLACOSA RULES'

O usuário nunca via.

Mas bastava descarregar a TIOA em um dump IPCS para encontrar a mensagem.


Continua na Parte 3

Na próxima etapa construiremos um Sistema de Cadastro de Clientes completo, contendo:

✔ Cadastro, Consulta e Alteração;

✔ Campos protegidos e desbloqueados;

✔ Cursor dinâmico;

✔ FSET, MDT e FRSET;

✔ Mensagens de erro;

✔ PF3, PF5, PF7 e PF8;

✔ Múltiplos mapas no mesmo MAPSET;

✔ Fluxograma completo de navegação;

✔ Troubleshooting de MAPFAIL, INVREQ, LENGERR e ASRA;

✔ Curiosidades sobre SDF II, 3279 colorido e a evolução do BMS até o CICS TS 6.x.