Assembler example: Getting a message using signaling
This example demonstrates how to use the MQGET call to set a signal so that you are notified when a suitable message arrives on a queue.
This extract is not taken from the sample applications supplied with IBM® MQ.
For the names and locations of the sample applications, see Using the sample procedural programs for z/OS®.
⋮
*
* CONNECT TO QUEUE MANAGER
*
CONN DS 0H
⋮
*
* OPEN A QUEUE FOR GET
*
OPEN DS 0H
⋮
*
* R4,R5,R6,R7 = WORK REGISTER.
*
GET DS 0H
LA R4,MQMD SET UP ADDRESSES AND
LA R5,MQMD_LENGTH LENGTH FOR USE BY MVCL
LA R6,WMD INSTRUCTION, AS MQMD IS
LA R7,WMD_LENGTH OVER 256 BYES LONG.
MVCL R6,R4 INITIALIZE WORKING VERSION
* OF MESSAGE DESCRIPTOR
*
MVC WGMO_AREA,MQGMO_AREA INITIALIZE WORKING MQGMO
LA R5,MQGMO_SET_SIGNAL
ST R5,WGMO_OPTIONS
MVC WGMO_WAITINTERVAL,FIVE_MINUTES WAIT UP TO FIVE
MINUTES BEFORE
* FAILING THE CALL
*
XC SIG_ECB,SIG_ECB CLEAR THE ECB
LA R5,SIG_ECB GET THE ADDRESS OF THE ECB
ST R5,WGMO_SIGNAL1 AND PUT IT IN THE WORKING
* MQGMO
*
LA R5,BUFFER_LEN RETRIEVE THE BUFFER LENGTH
ST R5,BUFFLEN AND SAVE IT FOR MQM USE
*
*
* ISSUE MQI GET REQUEST USING REENTRANT FORM OF CALL MACRO
*
* HCONN WAS SET BY PREVIOUS MQCONN REQUEST
* HOBJ WAS SET BY PREVIOUS MQOPEN REQUEST
*
CALL MQGET, X
(HCONN, X
HOBJ, X
WMD, X
WGMO, X
BUFFLEN, X
BUFFER, X
DATALEN, X
COMPCODE, X
REASON), X
VL,MF=(E,CALLLST)
*
LA R5,MQCC_OK DID THE MQGET REQUEST
C R5,COMPCODE WORK OK?
BE GETOK YES, SO GO AND PROCESS.
LA R5,MQCC_WARNING NO, SO CHECK FOR A WARNING.
C R5,COMPCODE IS THIS A WARNING?
BE CHECK_W YES, SO CHECK THE REASON.
B BADCALL NO, SO GO TO ERROR ROUTINE
*
CHECK_W DS 0H
LA R5,MQRC_SIGNAL_REQUEST_ACCEPTED
C R5,REASON SIGNAL REQUEST SIGNAL SET?
BNE BADCALL NO, SOME ERROR OCCURRED
B DOWORK YES, SO DO SOMETHING
* ELSE
*
CHECKSIG DS 0H
CLC SIG_ECB+1(3),=AL3(MQEC_MSG_ARRIVED)
IS A MESSAGE AVAILABLE?
BE GET YES, SO GO AND GET IT
*
CLC SIG_ECB+1(3),=AL3(MQEC_WAIT_INTERVAL_EXPIRED)
HAVE WE WAITED LONG ENOUGH?
BE NOMSG YES, SO SAY NO MSG AVAILABLE
B BADCALL IF IT'S ANYTHING ELSE
* GO TO ERROR ROUTINE.
*
DOWORK DS 0H
⋮
TM SIG_ECB,X'40' HAS THE SIGNAL ECB BEEN POSTED?
BO CHECKSIG YES, SO GO AND CHECK WHY
B DOWORK NO, SO GO AND DO MORE WORK
*
NOMSG DS 0H
⋮
GETOK DS 0H
⋮
BADCALL DS 0H
⋮
*
* CONSTANTS
*
CMQMDA DSECT=NO,LIST=YES
CMQGMOA DSECT=NO,LIST=YES
CMQA
*
FIVE_MINUTES DC F'300000' GET SIGNAL INTERVAL
*
* WORKING STORAGE DSECT
*
WORKSTG DSECT
*
COMPCODE DS F
REASON DS F
BUFFLEN DS F
DATALEN DS F
OPTIONS DS F
HCONN DS F
HOBJ DS F
SIG_ECB DS F
*
BUFFER DS CL80
BUFFER_LEN EQU *-BUFFER
*
WMD CMQMDA DSECT=NO,LIST=NO
WGMO CMQGMOA DSECT=NO,LIST=NO
*
CALLLST CALL ,(0,0,0,0,0,0,0,0,0,0,0),VL,MF=L
*
⋮
END