Getting a message using signaling
This example demonstrates how to use the MQGET call to set a signal so that we are notified when a suitable message arrives on a queue.
This extract is not taken from the sample applications supplied with IBM MQ .⋮ * * 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 * ⋮ ENDParent topic: System/390 assembler-language examples