terça-feira, 12 de fevereiro de 2019

🟦 Exemplo de Programa COBOL – Tratamento de Mensagem IBM MQ

 


🟦 Exemplo de Programa COBOL – Tratamento de Mensagem IBM MQ


🎯 O que este programa faz

  1. Conecta ao Queue Manager

  2. Abre uma fila de entrada

  3. Lê uma mensagem (MQGET)

  4. Trata o conteúdo

  5. Atualiza dados (simulado)

  6. Faz COMMIT

  7. Fecha fila e desconecta


🧱 Premissas do exemplo

  • Execução:

    • Batch ou CICS (a lógica é a mesma)

  • Fila:

    • QUEUE.IN

  • Queue Manager:

    • QMGR01

  • Mensagem:

    • Texto simples

  • Modelo:

    • MQI síncrono

    • Commit explícito


📦 COPYBOOKS NECESSÁRIOS

COPY CMQC. COPY CMQX.

📌 Esses copybooks vêm do IBM MQ for z/OS
Normalmente ficam em SCSQCOBC.


🧠 Estrutura do Programa


🔹 IDENTIFICATION DIVISION

IDENTIFICATION DIVISION. PROGRAM-ID. MQCONSUM.

🔹 DATA DIVISION

DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-QMGR-NAME PIC X(48) VALUE 'QMGR01'. 01 WS-QUEUE-NAME PIC X(48) VALUE 'QUEUE.IN'. 01 WS-HCONN PIC S9(9) COMP. 01 WS-HOBJ PIC S9(9) COMP. 01 WS-COMPCODE PIC S9(9) COMP. 01 WS-REASON PIC S9(9) COMP. 01 WS-MSG-LEN PIC S9(9) COMP. 01 WS-BUFFER. 05 WS-MSG PIC X(1024). 01 WS-MD LIKE MQMD. 01 WS-GMO LIKE MQGMO. 01 WS-OD LIKE MQOD.

🔹 PROCEDURE DIVISION


1️⃣ Conectar ao Queue Manager

CALL 'MQCONN' USING WS-QMGR-NAME WS-HCONN WS-COMPCODE WS-REASON. IF WS-COMPCODE NOT = MQCC-OK DISPLAY 'ERRO MQCONN - REASON: ' WS-REASON GO TO FIM-PROGRAMA END-IF.

📌 Easter egg:
Se falhar aqui, o problema não é a fila, é ambiente.


2️⃣ Abrir a fila

MOVE MQOD-DEFAULT TO WS-OD. MOVE WS-QUEUE-NAME TO WS-OD-OBJECTNAME. MOVE MQOO-INPUT-AS-Q-DEF TO WS-OD-OPTIONS. CALL 'MQOPEN' USING WS-HCONN WS-OD WS-HOBJ WS-COMPCODE WS-REASON. IF WS-COMPCODE NOT = MQCC-OK DISPLAY 'ERRO MQOPEN - REASON: ' WS-REASON GO TO DESCONECTA END-IF.

3️⃣ Ler a mensagem (MQGET)

MOVE MQMD-DEFAULT TO WS-MD. MOVE MQGMO-DEFAULT TO WS-GMO. MOVE MQGMO-WAIT TO WS-GMO-OPTIONS. MOVE 5000 TO WS-GMO-WAITINTERVAL. CALL 'MQGET' USING WS-HCONN WS-HOBJ WS-MD WS-GMO LENGTH OF WS-BUFFER WS-BUFFER WS-MSG-LEN WS-COMPCODE WS-REASON. IF WS-COMPCODE = MQCC-FAILED IF WS-REASON = MQRC-NO-MSG-AVAILABLE DISPLAY 'SEM MENSAGEM NA FILA' GO TO FECHA-FILA ELSE DISPLAY 'ERRO MQGET - REASON: ' WS-REASON GO TO ROLLBACK END-IF END-IF.

📌 Regra de ouro:

MQRC 2033 não é erro. É silêncio.


4️⃣ Tratar a mensagem

DISPLAY 'MENSAGEM RECEBIDA: ' WS-MSG(1:WS-MSG-LEN). *> Aqui você trataria o conteúdo: *> Parse, valida, chama DB2, CICS, etc.

5️⃣ Commit da transação

CALL 'MQCMIT' USING WS-HCONN WS-COMPCODE WS-REASON. IF WS-COMPCODE NOT = MQCC-OK DISPLAY 'ERRO MQCMIT - REASON: ' WS-REASON GO TO ROLLBACK END-IF.

📌 Easter egg clássico:

90% dos “problemas de MQ” são COMMIT esquecido.


6️⃣ Fechar fila e desconectar

FECHA-FILA. CALL 'MQCLOSE' USING WS-HCONN WS-HOBJ MQCO-NONE WS-COMPCODE WS-REASON. DESCONECTA. CALL 'MQDISC' USING WS-HCONN WS-COMPCODE WS-REASON.

7️⃣ Rollback (se algo der errado)

ROLLBACK. CALL 'MQBACK' USING WS-HCONN WS-COMPCODE WS-REASON. DISPLAY 'ROLLBACK EXECUTADO'. GO TO FECHA-FILA.

🔚 Fim do programa

FIM-PROGRAMA. STOP RUN.

🧠 O que este exemplo ensina (de verdade)

✔ Fluxo correto do MQ
✔ Tratamento de erros
✔ Uso de COMMIT / ROLLBACK
✔ Código legível para mainframer
✔ Pronto para:

  • Batch

  • CICS

  • IMS

  • DB2


📌 Dicas Bellacosa Mainframe

  • Sempre trate:

    • 2033 (no message)

    • 2009 (connection broken)

  • Nunca:

    • Esqueça COMMIT

    • Assuma que mensagem foi consumida

  • Pense em MQ como:

    DB2 sem SQL

     

Sem comentários:

Enviar um comentário