COBOL example: Getting a message using signaling
This example demonstrates how to use the MQGET call with signaling. Signaling is available only with IBM® MQ for z/OS®.
This extract is taken from the Credit Check sample application (program CSQ4CVB2).
For the names and locations of the sample applications, see Using the sample procedural programs for z/OS.
⋮
* -------------------------------------------------------*
WORKING-STORAGE SECTION.
* -------------------------------------------------------*
*
* W00 - General work fields
⋮
01 W00-WAIT-INTERVAL PIC S9(09) BINARY VALUE 30000.
*
* W03 - MQM API fields
*
01 W03-HCONN PIC S9(9) BINARY VALUE ZERO.
01 W03-HOBJ-REPLYQ PIC S9(9) BINARY.
01 W03-COMPCODE PIC S9(9) BINARY.
01 W03-REASON PIC S9(9) BINARY.
01 W03-DATALEN PIC S9(9) BINARY.
01 W03-BUFFLEN PIC S9(9) BINARY.
⋮
01 W03-GET-BUFFER.
05 W03-CSQ4BQRM.
COPY CSQ4VB4.
*
05 W03-CSQ4BIIM REDEFINES W03-CSQ4BQRM.
COPY CSQ4VB1.
*
05 W03-CSQ4BPGM REDEFINES W03-CSQ4BIIM.
COPY CSQ4VB5.
⋮
* API control blocks
*
01 MQM-MESSAGE-DESCRIPTOR.
COPY CMQMDV.
01 MQM-GET-MESSAGE-OPTIONS.
COPY CMQGMOV.
⋮
* MQV contains constants (for filling in the
* control blocks) and return codes (for testing
* the result of a call).
*
01 MQM-MQV.
COPY CMQV SUPPRESS.
* -------------------------------------------------------*
LINKAGE SECTION.
* -------------------------------------------------------*
01 L01-ECB-ADDR-LIST.
05 L01-ECB-ADDR1 POINTER.
05 L01-ECB-ADDR2 POINTER.
*
01 L02-ECBS.
05 L02-INQUIRY-ECB1 PIC S9(09) BINARY.
05 L02-REPLY-ECB2 PIC S9(09) BINARY.
01 REDEFINES L02-ECBS.
05 PIC X(02).
05 L02-INQUIRY-ECB1-CC PIC S9(04) BINARY.
05 PIC X(02).
05 L02-REPLY-ECB2-CC PIC S9(04) BINARY.
*
* -------------------------------------------------------*
PROCEDURE DIVISION.
* -------------------------------------------------------*
⋮
* Initialize variables, open queues, set signal on
* inquiry queue.
⋮
* -------------------------------------------------------*
PROCESS-SIGNAL-ACCEPTED SECTION.
* -------------------------------------------------------*
* This section gets a message with signal. If a *
* message is received, process it. If the signal *
* is set or is already set, the program goes into *
* an operating system wait. *
* Otherwise an error is reported and call error set. *
* -------------------------------------------------------*
*
PERFORM REPLYQ-GETSIGNAL.
*
EVALUATE TRUE
WHEN (W03-COMPCODE = MQCC-OK AND
W03-REASON = MQRC-NONE)
PERFORM PROCESS-REPLYQ-MESSAGE
*
WHEN (W03-COMPCODE = MQCC-WARNING AND
W03-REASON = MQRC-SIGNAL-REQUEST-ACCEPTED)
OR
(W03-COMPCODE = MQCC-FAILED AND
W03-REASON = MQRC-SIGNAL-OUTSTANDING)
PERFORM EXTERNAL-WAIT
*
WHEN OTHER
MOVE 'MQGET SIGNAL' TO M02-OPERATION
MOVE MQOD-OBJECTNAME TO M02-OBJECTNAME
PERFORM RECORD-CALL-ERROR
MOVE W06-CALL-ERROR TO W06-CALL-STATUS
END-EVALUATE.
*
PROCESS-SIGNAL-ACCEPTED-EXIT.
* Return to performing section
EXIT.
EJECT
*
* -------------------------------------------------------*
EXTERNAL-WAIT SECTION.
* -------------------------------------------------------*
* This section performs an external CICS wait on two *
* ECBs until at least one is posted. It then calls *
* the sections to handle the posted ECB. *
* -------------------------------------------------------*
EXEC CICS WAIT EXTERNAL
ECBLIST(W04-ECB-ADDR-LIST-PTR)
NUMEVENTS(2)
END-EXEC.
*
* At least one ECB must have been posted to get to this
* point. Test which ECB has been posted and perform
* the appropriate section.
*
IF L02-INQUIRY-ECB1 NOT = 0
PERFORM TEST-INQUIRYQ-ECB
ELSE
PERFORM TEST-REPLYQ-ECB
END-IF.
*
EXTERNAL-WAIT-EXIT.
*
* Return to performing section.
*
EXIT.
EJECT
⋮
* -------------------------------------------------------*
REPLYQ-GETSIGNAL SECTION.
* -------------------------------------------------------*
* *
* This section performs an MQGET call (in syncpoint with *
* signal) on the reply queue. The signal field in the *
* MQGMO is set to the address of the ECB. *
* Response handling is done by the performing section. *
* *
* -------------------------------------------------------*
*
COMPUTE MQGMO-OPTIONS = MQGMO-SYNCPOINT +
MQGMO-SET-SIGNAL.
MOVE W00-WAIT-INTERVAL TO MQGMO-WAITINTERVAL.
MOVE LENGTH OF W03-GET-BUFFER TO W03-BUFFLEN.
*
MOVE ZEROS TO L02-REPLY-ECB2.
SET MQGMO-SIGNAL1 TO ADDRESS OF L02-REPLY-ECB2.
*
* Set msgid and correlid to nulls so that any message
* will qualify.
*
MOVE MQMI-NONE TO MQMD-MSGID.
MOVE MQCI-NONE TO MQMD-CORRELID.
*
CALL 'MQGET' USING W03-HCONN
W03-HOBJ-REPLYQ
MQMD
MQGMO
W03-BUFFLEN
W03-GET-BUFFER
W03-DATALEN
W03-COMPCODE
W03-REASON.
*
REPLYQ-GETSIGNAL-EXIT.
*
* Return to performing section.
*
EXIT.
EJECT
*
⋮