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 WebSphere(R) 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
*

  ·
  ·
  ·
END