CBL XOPTS(ANSI85)
CBL NODYNAM,LIB,OBJECT,RENT,RES,APOST * ------------------------------------------------------------- * IDENTIFICATIONDIVISION. * ------------------------------------------------------------- * PROGRAM-ID. CSQ4CVB4. *REMARKS ***************************************************************** * @START_COPYRIGHT@ * * Statement: Licensed Materials - Property of IBM * * * * 5695-137 * * (C) Copyright IBM Corporation. 1993, 1997 * * * * Status: Version 1 Release 2 * * @END_COPYRIGHT@ * * * * Module Name : CSQ4CVB4 * * * * Environment : CICS/ESA Version 3.3; COBOL II * * * * CICS Transaction Name : MVB4 * * * * Description : Sample program to show the distribution of * * a query message to a number of queues, whose * * names are recovered from a namelist, and the * * notification of the originators reply queue of * * the number of messages forwarded * * * * Function : This program provides the distribution process * * function for the credit check sample * * See IBM MQSeries for MVS/ESA Application * * Programming Reference for details. * * * * Restriction : Maximum of 10 queues in Namelist can be used * * * * ************************************************************* *
EJECT * ************************************************************* * * * * Program logic * * ------------- * * * * Start (A-MAIN SECTION) * * ----- * * Check the program is started with data. * * If no go to invalid-start-routine * * End-if * * Retrieve input queue name from trigger data * * Retrieve namelist name from trigger data * * If no namelist name passed * * Use default namelist name * * End-if * * * * Open the input queue * * If open unsuccessful * * Record error and exit from program * * End-if * * * * Get the output queue names from the namelist * * If number of output queues not equal to zero * * Open the output queues * * End-if * * * * Set the call parameters * * Get a message from the input queue with wait * * * * Do while messages are retrieved * * Evaluate message received * * When expected message type * * If number of output queues not equal to zero * * Perform PROCESS-QUERY * * Else * * Perform PROCESS-ABNORMAL-QUERY * * End-if * * When other * * Perform CHECKQ-UNKNOWN-MSG * * End-evaluate * * Reset the call parameters * * Get the next message from the input queue with wait * * End-do * * * * If loop has not ended because no message is available * * Record the reason * * End-If * * * * Close the queues * * Return to CICS * * * * * * PROCESS-QUERY SECTION * * --------------------- * * Set messages sent to 1 * * Do for each output queue * * Put message to queue * * If put successful * * Add one to messages sent * * Else * * Record the error * * End-if * * End-do * * * * Put propagation message, containing number of messages * * sent to reply queue * * If put not successful * * Record the error * * Send the message to the dead letter queue * * End-if * * * * Return to performing section * * * * * * PROCESS-ABNORMAL-QUERY SECTION * * ------------------------------ * * Set messages sent to 1 * * Put error message to the reply queue * * If put successful * * Add one to messages sent * * Else * * Record the error * * Send the message to the dead letter queue * * End-if * * * * Put propagation message, containing number of messages * * sent to reply queue * * If put not successful * * Record the error * * Send the message to the dead letter queue * * End-if * * * * Return to performing section * * * * * * GET-QUEUE-NAMES * * --------------- * * Open the namelist (Perform OPEN-NAMELIST) * * If open unsuccessful * * Return to performing section * * End-if * * * * Inquire number of queues in namelist and their names * * If too many queus in namelist * * Record the error * * Set number of queues to 10 * * Else if call fails for any other reason * * Record the error * * Set number of queues to 0 * * End-if * * * * Close the namelist (Perform CLOSE-NAMELIST) * * * * Return to performing section * * * * * * OPEN-NAMELIST * * ------------- * * Set the object descriptor and open options to open the * * namelist for inquiry * * * * Open the namelist * * If open unsuccessful * * Record the error * * End-if * * * * Return to performing section * * * * * * CLOSE-NAMELIST * * -------------- * * Close the namelist * * If close unsuccessful * * Record the error * * End-if * * * * Return to performing section * * * * * * OPEN-OUTPUT-QUEUES * * ------------------ * * Set the object descriptor and open options to open the * * queue for output and to pass identity context * * * * Do until all queues open, stop if any open fails * * Move queue name to object descriptor * * Open the queue * * If open unsuccessful * * Record the error * * End-if * * * * If any open failed * * Update number of queues with the number opened * * End-if * * * * Return to performing section * * * * * * CLOSE-QUEUES * * ------------ * * Close the input queue * * If close unsuccessful * * Record the error * * End-if * * * * Allow the output queues to be closed by the queue * * manager after the program terminates * * * * Return to performing section * * * * * * CHECKQ-UNKNOWN-MSG * * ------------------ * * Record the error * * Forward the message to the samples dead queue * * * * Return to performing section * * * * * * RECORD-CALL-ERROR * * ----------------- * * Get the time from CICS * * Get the time formatted by CICS * * Build the output message data * * * * Write the call error message to CICS TS queue CSQ4SAMP * * Write the log error message to CICS TD queue CSML * * * * Return to performing section * * * * * * FORWARD-MSG-TO-DLQ * * ------------------ * * Set the object descriptor, open options, and message * * descriptor to enable the message to be put to the * * samples dead letter queue * * * * If message to be sent is longer than buffer * * Set message length to send the full buffer * * End-if * * * * Put the message (using MQPUT1) to the queue * * If put successful * * Record the fact * * Else * * Record the error * * End-if * * * * Return to performing section * * * * * * INVALID-START-ROUTINE * * --------------------- * * Build error message * * Send message * * Return to cics. * * * * ************************************************************* *
EJECT * ------------------------------------------------------------- * ENVIRONMENTDIVISION. * ------------------------------------------------------------- * * ------------------------------------------------------------- * DATADIVISION. * ------------------------------------------------------------- * * ------------------------------------------------------------- * WORKING-STORAGESECTION. * ------------------------------------------------------------- * * * W00 - General work fields * 01 W00-MESSAGE PIC X(70). 01 W00-STARTCODE PIC X(02). 01 W00-WAIT-INTERVAL PIC S9(9) BINARYVALUE30000. 01 W00-INDEX PIC S9(9) BINARY. 01 W00-MSGS-SENT PIC S9(9) BINARY. * * W01 - Queue names * 01 W01-QUEUE-NAMES. 05 W01-DEAD-QNAME PIC X(48) VALUE 'CSQ4SAMP.DEAD.QUEUE '. 05 W01-NAMELIST PIC X(48) VALUE 'CSQ4SAMP.B4.NAMELIST '. * * CSQ4VB8 contains error messages used in this program *
COPY CSQ4VB8. * * Messages returned by this program as part of a reply * message (CSQ4BQRM) * 77 W02-MESSAGE-1 PIC X(79) VALUE '****** RESPONSE FROM DISTRIBUTION PROCESS ******'. * 77 W02-MESSAGE-2 PIC X(79) VALUE '****** PROBLEMS WITH FORWARDING QUERIES ******'. * 77 W02-MESSAGE-3 PIC X(79) VALUE '****** CONTACT SYSTEM SUPPORT ******'. * * W03 - API fields * 01 W03-HCONN PIC S9(9) BINARYVALUEZERO. 01 W03-OPTIONS PIC S9(9) BINARY. 01 W03-HOBJ-CHECKQ PIC S9(9) BINARY. 01 W03-HOBJ-NAMELIST PIC S9(9) BINARY. 01 W03-HOBJ-OUTPUT-TABLE. 05 W03-HOBJ-OUTPUT PIC S9(9) BINARYOCCURS10 TIMES. 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-SELECTORCOUNT PIC S9(9) BINARYVALUE2. 01 W03-INTATTRCOUNT PIC S9(9) BINARYVALUE1. 01 W03-CHARATTRLENGTH PIC S9(9) BINARYVALUE480. 01 W03-CHARATTRS-TABLE. 05 W03-QUEUE-NAME PIC X(48) OCCURS10 TIMES. 01 W03-SELECTORS-TABLE. 05 W03-SELECTORS PIC S9(9) BINARYOCCURS2 TIMES. 01 W03-INTATTRS-TABLE. 05 W03-NUMBER-OF-QUEUES PIC S9(9) BINARY. * 01 W03-MSG-BUFFER. 05 W03-CSQ4BQRM.
COPY CSQ4VB4. * 05 W03-CSQ4BCAQ REDEFINES W03-CSQ4BQRM.
COPY CSQ4VB3. * 01 W03-PUT-BUFFER. 05 W03-CSQ4BPGM.
COPY CSQ4VB5. * * API control blocks * 01 W04-MQM-OBJECT-DESCRIPTOR.
COPY CMQODV. 01 W04-MQM-MESSAGE-DESCRIPTOR.
COPY CMQMDV. 01 W04-MQM-PUT-MESSAGE-OPTIONS.
COPY CMQPMOV. 01 W04-MQM-GET-MESSAGE-OPTIONS.
COPY CMQGMOV. 01 W04-TRIGGER-MESSAGE.
COPY CMQTML. * * Error message handling fields * 01 W05-TD-MESSAGE-LENGTH PIC S9(4) BINARY. 01 W05-TS-MESSAGE-LENGTH PIC S9(4) BINARY. 01 W05-ABSTIME PIC S9(15) COMP-3. * * * CMQV contains constants (for filling in the control blocks) * and return codes (for testing the result of a call) * 01 W99-MQV.
COPY CMQV SUPPRESS. * * DFHAID contains the constants used for checking for * attention identifiers *
COPY DFHAID SUPPRESS. * * ------------------------------------------------------------- * LINKAGESECTION. * ------------------------------------------------------------- * *
EJECT * ------------------------------------------------------------- * PROCEDUREDIVISION. * ------------------------------------------------------------- * * ------------------------------------------------------------- *
A-MAIN SECTION. * ------------------------------------------------------------- * * * * This section initializes and controls the program flow * * * * After opening the queues, the program enters a loop * * getting and processing messages. Once no more messages * * are available, shown by the program timing out, control is * * returned to CICS * * * * ------------------------------------------------------------ * * * Check that the program has been started with data * EXECCICSASSIGN
STARTCODE(W00-STARTCODE) END-EXEC. * IF W00-STARTCODE NOT = 'SD' PERFORM INVALID-START-ROUTINE * No return from INVALID-START-ROUTINE END-IF. * * Retrieve the trigger data for this transaction * EXECCICS RETRIEVE INTO(MQTM) END-EXEC. * * At this point the data retrieved has the name of the queue * which has caused this program to be triggered * * Replace the Namelist name, if one was passed in the trigger * message * IF MQTM-USERDATA NOT = SPACES MOVE MQTM-USERDATA TO W01-NAMELIST END-IF. * * Open the queue * MOVE MQOT-Q TO MQOD-OBJECTTYPE. MOVE MQTM-QNAME TO MQOD-OBJECTNAME. * * Initialize options and open the queue for input * COMPUTE W03-OPTIONS = MQOO-INPUT-SHARED +
MQOO-SAVE-ALL-CONTEXT. * CALL'MQOPEN'USING W03-HCONN
MQOD
W03-OPTIONS
W03-HOBJ-CHECKQ
W03-COMPCODE
W03-REASON. * * Test the output from the open, if * not ok then exit program * IF W03-COMPCODE NOT = MQCC-OK THEN MOVE'MQOPEN'TO M02-OPERATION MOVE MQOD-OBJECTNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR GOTO A-MAIN-EXIT. * * Get the queue names from the namelist and open them * PERFORM GET-QUEUE-NAMES. * IF W03-NUMBER-OF-QUEUES NOT = ZERO PERFORM OPEN-OUTPUT-QUEUES END-IF. * * Now get and process messages * COMPUTE MQGMO-OPTIONS = MQGMO-WAIT +
MQGMO-ACCEPT-TRUNCATED-MSG +
MQGMO-SYNCPOINT. * MOVELENGTHOF W03-MSG-BUFFER TO W03-BUFFLEN. MOVE W00-WAIT-INTERVAL TO MQGMO-WAITINTERVAL. MOVE MQMI-NONE TO MQMD-MSGID. MOVE MQCI-NONE TO MQMD-CORRELID. * * Make the first MQGET call outside the loop * CALL'MQGET'USING W03-HCONN
W03-HOBJ-CHECKQ
MQMD
MQGMO
W03-BUFFLEN
W03-MSG-BUFFER
W03-DATALEN
W03-COMPCODE
W03-REASON. * * Test the output of the MQGET call using the PERFORM loop * that follows * * * Loop from here to END-PERFORM until the MQGET call fails. * PERFORMWITHTESTBEFORE UNTIL W03-COMPCODE = MQCC-FAILED * * Process the message received * EVALUATETRUE WHEN ACCOUNT-QUERY-MESSAGE IF W03-NUMBER-OF-QUEUES NOT = ZERO PERFORM PROCESS-QUERY ELSE PERFORM ABNORMAL-PROCESS-QUERY END-IF WHENOTHER PERFORM CHECKQ-UNKNOWN-MSG END-EVALUATE * EXECCICS SYNCPOINT END-EXEC * * Reset parameters for the next call * MOVELENGTHOF W03-MSG-BUFFER TO W03-BUFFLEN MOVE MQMI-NONE TO MQMD-MSGID MOVE MQCI-NONE TO MQMD-CORRELID * * Get the next message * CALL'MQGET'USING W03-HCONN
W03-HOBJ-CHECKQ
MQMD
MQGMO
W03-BUFFLEN
W03-MSG-BUFFER
W03-DATALEN
W03-COMPCODE
W03-REASON * * Test the output of the MQGET call at the top of the loop. * Exit the loop if an error occurs * END-PERFORM. * * Test the output of the MQGET call. If the call failed, * print an error message showing the completion code and * reason code, unless the reason code is NO-MSG-AVAILABLE * IF (W03-COMPCODE NOT = MQCC-FAILED) OR
(W03-REASON NOT = MQRC-NO-MSG-AVAILABLE) MOVE'MQGET 'TO M02-OPERATION MOVE MQOD-OBJECTNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR END-IF. * PERFORM CLOSE-QUEUES. *
A-MAIN-EXIT. * * Return to CICS * EXECCICSRETURN END-EXEC. * GOBACK.
EJECT * * ------------------------------------------------------------- *
PROCESS-QUERY SECTION. * ------------------------------------------------------------- * * * * This section forwards the received message (CSQ4BCAQ) * * message to each output queue. * * * * If any of the puts fails the error is recorded but the * * process continues. For each successful put the count of * * messages is incremented by one. * * * * Then a propagation message is sent to the reply queue* * of the query. * * * * ------------------------------------------------------------ * * * put message to each of the output queues * MOVELENGTHOF CSQ4BCAQ-MSG TO W03-BUFFLEN. MOVE1TO W00-MSGS-SENT. * PERFORMWITHTESTAFTERVARYING W00-INDEX FROM1BY1 UNTIL (W00-INDEX = W03-NUMBER-OF-QUEUES) * MOVE MQMT-REQUEST TO MQMD-MSGTYPE MOVE MQRO-PASS-CORREL-ID TO MQMD-REPORT MOVE MQMI-NONE TO MQMD-MSGID COMPUTE MQPMO-OPTIONS = MQPMO-SYNCPOINT +
MQPMO-PASS-IDENTITY-CONTEXT MOVE W03-HOBJ-CHECKQ TO MQPMO-CONTEXT * CALL'MQPUT'USING W03-HCONN
W03-HOBJ-OUTPUT(W00-INDEX)
MQMD
MQPMO
W03-BUFFLEN
W03-MSG-BUFFER
W03-COMPCODE
W03-REASON * IF W03-COMPCODE NOT = MQCC-OK THEN MOVE'MQPUT'TO M02-OPERATION MOVE W03-QUEUE-NAME(W00-INDEX) TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR ELSE ADD1TO W00-MSGS-SENT END-IF END-PERFORM. * * put propagation message to reply queue * MOVE MQOT-Q TO MQOD-OBJECTTYPE MOVE MQMD-REPLYTOQ TO MQOD-OBJECTNAME. MOVE MQMD-REPLYTOQMGR TO MQOD-OBJECTQMGRNAME. MOVE MQMT-DATAGRAM TO MQMD-MSGTYPE. MOVE MQRO-NONE TO MQMD-REPORT. MOVESPACESTO MQMD-REPLYTOQ. MOVESPACESTO MQMD-REPLYTOQMGR. MOVE MQMI-NONE TO MQMD-MSGID. * MOVELENGTHOF CSQ4BPGM-MSG TO W03-BUFFLEN. SET PROPAGATION-MESSAGE TOTRUE. MOVE W00-MSGS-SENT TO CSQ4BPGM-MSGS-SENT. * CALL'MQPUT1'USING W03-HCONN
MQOD
MQMD
MQPMO
W03-BUFFLEN
W03-PUT-BUFFER
W03-COMPCODE
W03-REASON. * IF W03-COMPCODE NOT = MQCC-OK MOVE'MQPUT1'TO M02-OPERATION MOVE MQOD-OBJECTNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR PERFORM FORWARD-MSG-TO-DLQ END-IF. *
PROCESS-QUERY-END. * * Return to performing section * EXIT.
EJECT * * ------------------------------------------------------------- *
ABNORMAL-PROCESS-QUERY SECTION. * ------------------------------------------------------------- * * * * This section is puts an error message (no queues to send * * messages on to) and a propagation message to the reply queue* * * * ------------------------------------------------------------ * * * Put error message to reply queue, as if it were a reply * message * MOVELENGTHOF CSQ4BQRM-MSG TO W03-BUFFLEN. MOVE1TO W00-MSGS-SENT. * SET QUERY-RESPONSE-MESSAGE TOTRUE. MOVE W02-MESSAGE-1 TO CSQ4BQRM-LINE(1). MOVE W02-MESSAGE-2 TO CSQ4BQRM-LINE(2). MOVE W02-MESSAGE-3 TO CSQ4BQRM-LINE(3). * MOVE MQOT-Q TO MQOD-OBJECTTYPE MOVE MQMD-REPLYTOQ TO MQOD-OBJECTNAME. MOVE MQMD-REPLYTOQMGR TO MQOD-OBJECTQMGRNAME. MOVE MQMT-REPLY TO MQMD-MSGTYPE. MOVE MQRO-NONE TO MQMD-REPORT. MOVESPACESTO MQMD-REPLYTOQ. MOVESPACESTO MQMD-REPLYTOQMGR. MOVE MQMI-NONE TO MQMD-MSGID. COMPUTE MQPMO-OPTIONS = MQPMO-SYNCPOINT +
MQPMO-PASS-IDENTITY-CONTEXT. MOVE W03-HOBJ-CHECKQ TO MQPMO-CONTEXT. * CALL'MQPUT1'USING W03-HCONN
MQOD
MQMD
MQPMO
W03-BUFFLEN
W03-MSG-BUFFER
W03-COMPCODE
W03-REASON. * IF W03-COMPCODE NOT = MQCC-OK THEN MOVE'MQPUT1'TO M02-OPERATION MOVE MQOD-OBJECTNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR PERFORM FORWARD-MSG-TO-DLQ ELSE ADD1TO W00-MSGS-SENT END-IF. * * put propagation message to reply to queue * MOVELENGTHOF CSQ4BPGM-MSG TO W03-BUFFLEN. SET PROPAGATION-MESSAGE TOTRUE. MOVE W00-MSGS-SENT TO CSQ4BPGM-MSGS-SENT. * MOVE MQMT-DATAGRAM TO MQMD-MSGTYPE. MOVE MQMI-NONE TO MQMD-MSGID. * CALL'MQPUT1'USING W03-HCONN
MQOD
MQMD
MQPMO
W03-BUFFLEN
W03-PUT-BUFFER
W03-COMPCODE
W03-REASON. * IF W03-COMPCODE NOT = MQCC-OK MOVE'MQPUT1'TO M02-OPERATION MOVE MQOD-OBJECTNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR PERFORM FORWARD-MSG-TO-DLQ END-IF. *
ABNORMAL-PROCESS-QUERY-END. * * Return to performing section * EXIT.
EJECT * * ------------------------------------------------------------- *
GET-QUEUE-NAMES SECTION. * ------------------------------------------------------------- * * * * This section inquires about number of queues in a namelist, * * and gets their names. If more than 10 names are in the * * namelist the section records and error and continues using * * the first 10 * * * * ------------------------------------------------------------ * * PERFORM OPEN-NAMELIST. * * Test for an error. If an error occurred, exit * IF W03-COMPCODE NOT = MQCC-OK GOTO GET-QUEUE-NAMES-EXIT END-IF. * * Initialize the variables for the MQINQ call, all other * variables were initialized at declaration or by opening * the namelist * MOVE MQIA-NAME-COUNT TO W03-SELECTORS(1). MOVE MQCA-NAMES TO W03-SELECTORS(2). * * Inquire on the attributes * CALL'MQINQ'USING W03-HCONN
W03-HOBJ-NAMELIST
W03-SELECTORCOUNT
W03-SELECTORS-TABLE
W03-INTATTRCOUNT
W03-INTATTRS-TABLE
W03-CHARATTRLENGTH
W03-CHARATTRS-TABLE
W03-COMPCODE
W03-REASON. * * Test the output from the inquiry: * * - If the completion code is not OK, display an error * message showing the completion and reason codes. * * - If the completion code is WARNING and the reason code * is CHAR-ATTRS-TOO-SHORT, display an error message and * use the first 10 queue names * EVALUATETRUE WHEN (W03-COMPCODE = MQCC-WARNING AND
W03-REASON = MQRC-CHAR-ATTRS-TOO-SHORT) MOVE'MQINQ NAMELIST'TO M02-OPERATION MOVE MQOD-OBJECTNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR * MOVE'TOO MANY NAMES'TO M02-OPERATION PERFORM RECORD-CALL-ERROR MOVE10TO W03-NUMBER-OF-QUEUES WHEN W03-COMPCODE NOT = MQCC-OK MOVE0TO W03-NUMBER-OF-QUEUES MOVE'MQINQ'TO M02-OPERATION MOVE MQOD-OBJECTNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR END-EVALUATE. * * Close the namelist * PERFORM CLOSE-NAMELIST. *
GET-QUEUE-NAMES-EXIT. * * Return to performing section * EXIT.
EJECT * * ------------------------------------------------------------- *
OPEN-NAMELIST SECTION. * ------------------------------------------------------------- * * * * This section opens the namelist * * * * ------------------------------------------------------------ * * * MOVE MQOT-NAMELIST TO MQOD-OBJECTTYPE. MOVE W01-NAMELIST TO MQOD-OBJECTNAME. MOVESPACESTO MQOD-OBJECTQMGRNAME. * COMPUTE W03-OPTIONS = MQOO-INQUIRE. * CALL'MQOPEN'USING W03-HCONN
MQOD
W03-OPTIONS
W03-HOBJ-NAMELIST
W03-COMPCODE
W03-REASON. * IF W03-COMPCODE NOT = MQCC-OK THEN MOVE'MQOPEN'TO M02-OPERATION MOVE MQOD-OBJECTNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR MOVE0TO W03-NUMBER-OF-QUEUES END-IF. *
OPEN-NAMELIST-EXIT. * * Return to performing section * EXIT.
EJECT * * ------------------------------------------------------------- *
CLOSE-NAMELIST SECTION. * ------------------------------------------------------------- * * * * This section closes the namelist * * * * ------------------------------------------------------------ * * CALL'MQCLOSE'USING W03-HCONN
W03-HOBJ-NAMELIST
MQCO-NONE
W03-COMPCODE
W03-REASON. * IF W03-COMPCODE NOT = MQCC-OK THEN MOVE'MQCLOSE'TO M02-OPERATION MOVE MQOD-OBJECTNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR END-IF. *
CLOSE-NAMELIST-EXIT. * * Return to performing section * EXIT.
EJECT * * ------------------------------------------------------------- *
OPEN-OUTPUT-QUEUES SECTION. * ------------------------------------------------------------- * * * * This section opens the queues whose names were obtained * * from the namelist * * * * ------------------------------------------------------------ * * MOVE MQOT-Q TO MQOD-OBJECTTYPE. COMPUTE W03-OPTIONS = MQOO-OUTPUT +
MQOO-PASS-IDENTITY-CONTEXT. * PERFORMWITHTESTAFTERVARYING W00-INDEX FROM1BY1 UNTIL (W00-INDEX = W03-NUMBER-OF-QUEUES OR
W03-COMPCODE NOT = MQCC-OK ) * MOVE W03-QUEUE-NAME(W00-INDEX) TO MQOD-OBJECTNAME * CALL'MQOPEN'USING W03-HCONN
MQOD
W03-OPTIONS
W03-HOBJ-OUTPUT(W00-INDEX)
W03-COMPCODE
W03-REASON * IF W03-COMPCODE NOT = MQCC-OK THEN MOVE'MQOPEN'TO M02-OPERATION MOVE MQOD-OBJECTNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR END-IF END-PERFORM. * * If all queues have not been opened successfully, set the * number of queues to the number opened * IF W03-COMPCODE NOT = MQCC-OK MOVE W00-INDEX TO W03-NUMBER-OF-QUEUES END-IF. *
OPEN-OUTPUT-QUEUES-EXIT. * * Return to performing section * EXIT.
EJECT * * ------------------------------------------------------------- *
CLOSE-QUEUES SECTION. * ------------------------------------------------------------- * * * * This section closes the inquiry queue. The output queues, * * from the namelist, are closed by the queue manager on * * termination of the task * * * * ------------------------------------------------------------ * * CALL'MQCLOSE'USING W03-HCONN
W03-HOBJ-CHECKQ
MQCO-NONE
W03-COMPCODE
W03-REASON. * IF W03-COMPCODE NOT = MQCC-OK MOVE'MQCLOSE'TO M02-OPERATION MOVE MQTM-QNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR END-IF. *
CLOSE-QUEUES-EXIT. * * Return to performing section * EXIT.
EJECT * * ------------------------------------------------------------- *
CHECKQ-UNKNOWN-MSG SECTION. * ------------------------------------------------------------- * * * * This section handles unexpected messages by recording the * * error and forwarding the message to the dead queue * * * * ------------------------------------------------------------ * * MOVE'UNKNOWN MSG DETECTED'TO M02-OPERATION. MOVE MQOD-OBJECTNAME TO M02-OBJECTNAME. * PERFORM RECORD-CALL-ERROR. * PERFORM FORWARD-MSG-TO-DLQ. *
CHECKQ-UNKNOWN-MSG-EXIT. * EXIT.
EJECT * * ------------------------------------------------------------- *
RECORD-CALL-ERROR SECTION. * ------------------------------------------------------------- * * * * This section writes an error message to the CICS td queue * * 'CSML' and the CICS ts queue 'CSQ4SAMP'. * * The failing operation and object name fields are completed * * by the calling application. The remaining fields of the * * message are completed by this routine * * * * ------------------------------------------------------------ * * EXECCICS ASKTIME
ABSTIME(W05-ABSTIME) END-EXEC. EXECCICS FORMATTIME
ABSTIME(W05-ABSTIME) DATE(M02-DATE) DATESEP TIME(M02-TIME) TIMESEP END-EXEC. * MOVE EIBTRNID TO M02-TRANSACTION
M03-TRANSACTION. MOVE EIBTASKN TO M02-TASK-NUMBER
M03-TASK-NUMBER. MOVE W03-COMPCODE TO M02-COMPCODE MOVE W03-REASON TO M02-REASON MOVE M02-DATE TO M03-DATE. MOVE M02-TIME TO M03-TIME. MOVELENGTHOF M02-CALL-ERROR-MSG TO W05-TS-MESSAGE-LENGTH MOVELENGTHOF M03-CSML-ERROR-MSG TO W05-TD-MESSAGE-LENGTH. * EXECCICS WRITEQ TS
QUEUE('CSQ4SAMP') FROM (M02-CALL-ERROR-MSG) LENGTH(W05-TS-MESSAGE-LENGTH) END-EXEC. * EXECCICS WRITEQ TD
QUEUE('CSML') FROM (M03-CSML-ERROR-MSG) LENGTH(W05-TD-MESSAGE-LENGTH) END-EXEC. *
RECORD-CALL-ERROR-EXIT. * * Return to performing section * EXIT.
EJECT * * ------------------------------------------------------------- *
FORWARD-MSG-TO-DLQ SECTION. * ------------------------------------------------------------- * * * * This section forwards a message to the samples dead queue. * * A message is written using RECORD-CALL-ERROR, the content * * of the message shows whether the message was put to the * * dead queue successfully * * * * ------------------------------------------------------------ * * MOVE MQOT-Q TO MQOD-OBJECTTYPE. MOVE W01-DEAD-QNAME TO MQOD-OBJECTNAME. * MOVE MQPER-PERSISTENCE-AS-Q-DEF TO MQMD-PERSISTENCE. * * Use syncpoint option to avoid possible duplicate messages * on dead queue * COMPUTE MQPMO-OPTIONS = MQPMO-SYNCPOINT +
MQPMO-PASS-IDENTITY-CONTEXT. MOVE W03-HOBJ-CHECKQ TO MQPMO-CONTEXT. * * Send as many bytes of the message as possible * IF W03-DATALEN ISLESSTHAN W03-BUFFLEN MOVE W03-DATALEN TO W03-BUFFLEN END-IF. * CALL'MQPUT1'USING W03-HCONN
MQOD
MQMD
MQPMO
W03-BUFFLEN
W03-MSG-BUFFER
W03-COMPCODE
W03-REASON. * EVALUATETRUE WHEN (W03-COMPCODE = MQCC-OK AND
W03-REASON = MQRC-NONE) MOVE'MSG PUT TO DLQ'TO M02-OPERATION MOVE W01-DEAD-QNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR WHENOTHER MOVE'MQPUT1'TO M02-OPERATION MOVE W01-DEAD-QNAME TO M02-OBJECTNAME PERFORM RECORD-CALL-ERROR END-EVALUATE. *
FORWARD-MSG-TO-DLQ-EXIT. * * Return to performing section * EXIT. * * ------------------------------------------------------------- *
INVALID-START-ROUTINE SECTION. * ------------------------------------------------------------- * * * * This section sets sends an error message to a terminal if * * the program is started without data. * * * * ------------------------------------------------------------ * * MOVESPACESTO W00-MESSAGE. STRING EIBTRNID
M04-STARTUP-ERROR DELIMITEDBYSIZEINTO W00-MESSAGE.
EXECCICS SEND
TEXT FROM(W00-MESSAGE)
FREEKB
ERASE END-EXEC. *
INVALID-START-ROUTINE-EXIT. * * Return to CICS * EXECCICSRETURN END-EXEC. * * * ------------------------------------------------------------- * * End of program * * ------------------------------------------------------------- *
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.28Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.
(vorverarbeitet am 2026-06-16)
¤