The user exit module must be called ES_MQMONEX and placed in your product's %ProgramFiles(x86)%\Micro Focus\Visual COBOL\bin (Windows) or $COBDIR/lib (UNIX) directory:
identification division. program-id. ES_MQMONEX. ***************************************************************** *** Example MQ monitoring exit. *** *** Stores a table of object handles and their names. *** ***************************************************************** environment division. configuration section. data division. working-storage section. 78 78-exit-version value 1. *> -- Flag to enable initialisation on first call 01 ws-initialised-flag pic x value 'n'. 88 ws-initialised-88 value 'y' false 'n'. *> -- Table to store mapping of objects and queue names 01 ws-object-table. 78 78-table-size value 10. 03 ws-obj-idx pic x(4) comp-5. 03 ws-object occurs 78-table-size times. 05 ws-obj-handle pic x(4) comp-5. 05 ws-obj-name pic x(48). linkage section. copy casmqmon.cpy replacing ==()== by ==lk==. procedure division using lk-mqmonex-out. if not ws-initialised-88 *> -- Initialise on first entry if 78-exit-version not = lk-mqmonex-version *> -- This exit is using a different version of casmqmon.cpy *> -- compared to the product, so switch off the exit. set lk-mqmonex-switch-off-88 to true goback end-if initialize ws-object-table set ws-initialised-88 to true end-if evaluate lk-mqmonex-api when = 'MQCONN' when = 'MQCONNX' when = 'MQDISC' *> -- No queue, so do nothing continue when = 'MQOPEN' *> -- Find a free space to save queue name and handle perform varying ws-obj-idx from 1 by 1 until ws-obj-idx > 78-table-size if ws-obj-handle(ws-obj-idx) = 0 *> -- Empty space found so populate with queue name and handle move lk-mqmonex-hobj to ws-obj-handle(ws-obj-idx) move lk-mqmonex-qname to ws-obj-name(ws-obj-idx) exit perform end-if end-perform if ws-obj-idx > 78-table-size *> -- No space in table to store this queue name and handle. *> -- Handle the error! continue end-if when other *> -- Locate queue name in table using object handle that was passed. perform varying ws-obj-idx from 1 by 1 until ws-obj-idx > 78-table-size if ws-obj-handle(ws-obj-idx) = lk-mqmonex-hobj *> -- Found the queue name in the table at ws-obj-idx exit perform end-if end-perform if ws-obj-idx > 78-table-size *> -- Failed to find the queue name *> -- Handle the error! continue end-if end-evaluate perform do-something if lk-mqmonex-api = 'MQCLOSE' *> -- Initialise element containing closed queue perform varying ws-obj-idx from 1 by 1 until ws-obj-idx > 78-table-size if ws-obj-handle(ws-obj-idx) = lk-mqmonex-hobj *> -- Found the queue, so clear this element initialize ws-object(ws-obj-idx) exit perform end-if end-perform end-if goback . do-something section. *> -- Log the data somewhere exit section . end program ES_MQMONEX.
casmqmon.cpy:
01 ()-mqmonex-out. 03 ()-mqmonex-version pic x(4) comp-5. 88 ()-mqmonex-version-1-88 value 1. 88 ()-mqmonex-switch-off-88 value 255. 03 ()-mqmonex-qmanager-name pic x(48). 03 ()-mqmonex-api-call-info. 05 ()-mqmonex-hconn pic x(4) comp-5. 05 ()-mqmonex-api pic x(8). 05 ()-mqmonex-qname pic x(48). 05 ()-mqmonex-hobj pic x(4) comp-5. 05 ()-mqmonex-jobname. 07 ()-mqmonex-termid pic x(4). 07 ()-mqmonex-tranid pic x(4). 05 ()-mqmonex-task pic x(4) comp-5. 05 ()-mqmonex-pid pic x(4) comp-5. 05 ()-mqmonex-timein. 07 ()-mqmonex-timein-year pic x(2) comp-x. 07 ()-mqmonex-timein-month pic x(1) comp-x. 07 ()-mqmonex-timein-day pic x(1) comp-x. 07 ()-mqmonex-timein-hour pic x(1) comp-x. 07 ()-mqmonex-timein-minute pic x(1) comp-x. 07 ()-mqmonex-timein-seconds pic x(1) comp-x. 07 ()-mqmonex-timein-ms pic x(2) comp-x. 05 ()-mqmonex-timeout. 07 ()-mqmonex-timeout-year pic x(2) comp-x. 07 ()-mqmonex-timeout-month pic x(1) comp-x. 07 ()-mqmonex-timeout-day pic x(1) comp-x. 07 ()-mqmonex-timeout-hour pic x(1) comp-x. 07 ()-mqmonex-timeout-minute pic x(1) comp-x. 07 ()-mqmonex-timeout-seconds pic x(1) comp-x. 07 ()-mqmonex-timeout-ms pic x(2) comp-x. 05 ()-mqmonex-duration-ms pic x(8) comp-x. 05 ()-mqmonex-compcode pic x(4) comp-5. 05 ()-mqmonex-reason pic x(4) comp-5.