The RECEIVE and END-RECEIVE statements represent comprehensive message handling and sophisticated inter-program communication capabilities within COBOL programming environments, providing advanced data reception mechanisms for modern enterprise applications, enhanced communication protocol support, and intelligent message processing features that enable precise data exchange operations, complex asynchronous communication workflows, and systematic message handling architectures. These statements embody modern messaging principles by supporting comprehensive message reception, enabling sophisticated communication protocols, and facilitating precise data transfer control requirements while maintaining message integrity, ensuring reliable communication patterns, and enabling flexible messaging architectures across enterprise applications requiring exact data exchange, communication validation capabilities, and reliable message processing throughout sophisticated business communication scenarios and distributed system integration workflows.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495*> Basic RECEIVE statement formats RECEIVE message-area FROM source-identifier SIZE IN message-length [NODATA] [ON EXCEPTION imperative-statements] [NOT ON EXCEPTION imperative-statements] END-RECEIVE *> CICS RECEIVE MAP operation RECEIVE MAP(map-name) MAPSET(mapset-name) INTO(data-area) [RESP(response-code)] END-RECEIVE *> Message queue RECEIVE RECEIVE message-text FROM queue-name LENGTH message-size [WAIT(timeout-value)] [ON EXCEPTION error-handling] END-RECEIVE *> Basic examples with different scenarios 01 WS-MESSAGE-AREA PIC X(1000). 01 WS-MESSAGE-LENGTH PIC 9(4) COMP. 01 WS-RESPONSE-CODE PIC S9(8) COMP. 01 WS-QUEUE-NAME PIC X(8) VALUE 'MSGQUEUE'. *> Simple message reception RECEIVE WS-MESSAGE-AREA FROM WS-QUEUE-NAME SIZE IN WS-MESSAGE-LENGTH ON EXCEPTION DISPLAY "Message reception failed" PERFORM ERROR-HANDLING NOT ON EXCEPTION DISPLAY "Message received: " WS-MESSAGE-AREA PERFORM PROCESS-MESSAGE END-RECEIVE *> CICS terminal communication RECEIVE MAP('CUSTMAP') MAPSET('CUSTSET') INTO(CUSTOMER-INPUT-AREA) RESP(WS-RESPONSE-CODE) END-RECEIVE IF WS-RESPONSE-CODE = DFHRESP(NORMAL) PERFORM PROCESS-CUSTOMER-INPUT ELSE PERFORM HANDLE-RECEIVE-ERROR END-IF *> Web service message handling 01 WS-XML-MESSAGE PIC X(5000). 01 WS-XML-LENGTH PIC 9(4) COMP VALUE 5000. RECEIVE WS-XML-MESSAGE FROM WEB-SERVICE-CHANNEL SIZE IN WS-XML-LENGTH NODATA ON EXCEPTION DISPLAY "Web service communication error" MOVE "ERROR" TO WS-STATUS-FLAG NOT ON EXCEPTION PERFORM PARSE-XML-MESSAGE PERFORM PROCESS-WEB-REQUEST END-RECEIVE *> Asynchronous message processing 01 WS-ASYNC-MESSAGE PIC X(2000). 01 WS-TIMEOUT-VALUE PIC 9(4) VALUE 30. RECEIVE WS-ASYNC-MESSAGE FROM ASYNC-QUEUE SIZE IN WS-MESSAGE-LENGTH WAIT(WS-TIMEOUT-VALUE) ON EXCEPTION EVALUATE WS-RESPONSE-CODE WHEN TIMEOUT-OCCURRED DISPLAY "Message timeout - no data received" PERFORM TIMEOUT-PROCESSING WHEN QUEUE-EMPTY DISPLAY "Queue empty - retrying" PERFORM RETRY-LOGIC WHEN OTHER DISPLAY "Unexpected error: " WS-RESPONSE-CODE PERFORM ERROR-RECOVERY END-EVALUATE NOT ON EXCEPTION DISPLAY "Async message processed successfully" PERFORM HANDLE-ASYNC-MESSAGE END-RECEIVE
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450IDENTIFICATION DIVISION. PROGRAM-ID. RECEIVE-DEMO. DATA DIVISION. WORKING-STORAGE SECTION. *> Message handling structures 01 WS-MESSAGE-CONTROL. 05 WS-MESSAGE-BUFFER PIC X(4000). 05 WS-MESSAGE-LENGTH PIC 9(4) COMP. 05 WS-MAX-MESSAGE-SIZE PIC 9(4) COMP VALUE 4000. 05 WS-ACTUAL-LENGTH PIC 9(4) COMP. 05 WS-MESSAGE-TYPE PIC X(8). 05 WS-SOURCE-ID PIC X(16). *> Response and status handling 01 WS-RESPONSE-HANDLING. 05 WS-RESPONSE-CODE PIC S9(8) COMP. 05 WS-ERROR-FLAG PIC X VALUE 'N'. 05 WS-RETRY-COUNT PIC 9(2) VALUE 0. 05 WS-MAX-RETRIES PIC 9(2) VALUE 3. 05 WS-STATUS-MESSAGE PIC X(100). *> CICS communication areas 01 WS-CICS-AREAS. 05 WS-COMMAREA PIC X(1000). 05 WS-COMMAREA-LENGTH PIC S9(4) COMP. 05 WS-TERMINAL-ID PIC X(4). 05 WS-TRANSACTION-ID PIC X(4). *> Customer input map from CICS 01 CUSTOMER-INPUT-AREA. 05 CI-CUSTOMER-NUMBER PIC X(8). 05 CI-CUSTOMER-NAME PIC X(30). 05 CI-PHONE-NUMBER PIC X(15). 05 CI-EMAIL-ADDRESS PIC X(50). 05 CI-ACTION-CODE PIC X(4). *> XML/JSON message structures 01 WS-XML-PROCESSING. 05 WS-XML-BUFFER PIC X(8000). 05 WS-XML-LENGTH PIC 9(4) COMP. 05 WS-XML-ROOT-ELEMENT PIC X(50). 05 WS-XML-NAMESPACE PIC X(100). *> Message queue processing 01 WS-QUEUE-PROCESSING. 05 WS-QUEUE-NAME PIC X(48). 05 WS-QUEUE-MANAGER PIC X(48). 05 WS-MESSAGE-ID PIC X(24). 05 WS-CORRELATION-ID PIC X(24). 05 WS-PRIORITY PIC 9(1). *> Business message structures 01 WS-BUSINESS-MESSAGES. 05 WS-ORDER-MESSAGE. 10 ORDER-ID PIC X(12). 10 CUSTOMER-ID PIC X(8). 10 ORDER-DATE PIC 9(8). 10 ORDER-AMOUNT PIC 9(8)V99. 10 ORDER-STATUS PIC X(10). 05 WS-PAYMENT-MESSAGE. 10 PAYMENT-ID PIC X(16). 10 ACCOUNT-NUMBER PIC X(20). 10 PAYMENT-AMOUNT PIC 9(10)V99. 10 PAYMENT-METHOD PIC X(12). 10 AUTHORIZATION-CODE PIC X(8). *> Processing statistics 01 WS-PROCESSING-STATS. 05 WS-MESSAGES-RECEIVED PIC 9(8) VALUE 0. 05 WS-MESSAGES-PROCESSED PIC 9(8) VALUE 0. 05 WS-MESSAGES-FAILED PIC 9(6) VALUE 0. 05 WS-TOTAL-BYTES PIC 9(12) VALUE 0. 05 WS-PROCESSING-TIME PIC 9(8) VALUE 0. PROCEDURE DIVISION. MAIN-RECEIVE-DEMO. DISPLAY "=== COBOL RECEIVE AND END-RECEIVE DEMONSTRATION ===" DISPLAY SPACES PERFORM DEMONSTRATE-BASIC-RECEIVE PERFORM DEMONSTRATE-CICS-RECEIVE PERFORM DEMONSTRATE-MESSAGE-QUEUE-RECEIVE PERFORM DEMONSTRATE-XML-MESSAGE-RECEIVE PERFORM DEMONSTRATE-ASYNC-PROCESSING PERFORM DEMONSTRATE-ERROR-HANDLING PERFORM DISPLAY-PROCESSING-SUMMARY DISPLAY "=== RECEIVE DEMONSTRATION COMPLETE ===" STOP RUN. DEMONSTRATE-BASIC-RECEIVE. DISPLAY "=== BASIC RECEIVE OPERATIONS ===" DISPLAY SPACES DISPLAY "Processing basic message reception..." *> Initialize message processing MOVE "MSGQUEUE1" TO WS-QUEUE-NAME MOVE WS-MAX-MESSAGE-SIZE TO WS-MESSAGE-LENGTH *> Basic RECEIVE with exception handling RECEIVE WS-MESSAGE-BUFFER FROM WS-QUEUE-NAME SIZE IN WS-MESSAGE-LENGTH ON EXCEPTION MOVE "RECEIVE_ERROR" TO WS-STATUS-MESSAGE MOVE 'Y' TO WS-ERROR-FLAG DISPLAY " ❌ Message reception failed: " WS-STATUS-MESSAGE PERFORM LOG-ERROR-DETAILS NOT ON EXCEPTION ADD 1 TO WS-MESSAGES-RECEIVED ADD WS-MESSAGE-LENGTH TO WS-TOTAL-BYTES MOVE 'N' TO WS-ERROR-FLAG DISPLAY " ✅ Message received successfully" DISPLAY " Length: " WS-MESSAGE-LENGTH " bytes" DISPLAY " Content: " WS-MESSAGE-BUFFER(1:50) "..." PERFORM PROCESS-BASIC-MESSAGE END-RECEIVE IF WS-ERROR-FLAG = 'N' DISPLAY " 📊 Basic message processing completed" ELSE DISPLAY " ⚠️ Basic message processing failed" END-IF DISPLAY SPACES. PROCESS-BASIC-MESSAGE. *> Extract message type and source MOVE WS-MESSAGE-BUFFER(1:8) TO WS-MESSAGE-TYPE MOVE WS-MESSAGE-BUFFER(9:16) TO WS-SOURCE-ID DISPLAY " Message Analysis:" DISPLAY " Type: " WS-MESSAGE-TYPE DISPLAY " Source: " WS-SOURCE-ID DISPLAY " Size: " WS-MESSAGE-LENGTH " bytes" *> Process based on message type EVALUATE WS-MESSAGE-TYPE WHEN "ORDER " PERFORM PROCESS-ORDER-MESSAGE WHEN "PAYMENT " PERFORM PROCESS-PAYMENT-MESSAGE WHEN "INQUIRY" PERFORM PROCESS-INQUIRY-MESSAGE WHEN OTHER DISPLAY " Unknown message type - forwarding to general handler" PERFORM PROCESS-UNKNOWN-MESSAGE END-EVALUATE ADD 1 TO WS-MESSAGES-PROCESSED. DEMONSTRATE-CICS-RECEIVE. DISPLAY "=== CICS RECEIVE OPERATIONS ===" DISPLAY SPACES DISPLAY "Processing CICS terminal communication..." *> CICS RECEIVE MAP operation RECEIVE MAP('CUSTMAP') MAPSET('CUSTSET') INTO(CUSTOMER-INPUT-AREA) RESP(WS-RESPONSE-CODE) END-RECEIVE *> Check CICS response EVALUATE WS-RESPONSE-CODE WHEN DFHRESP(NORMAL) DISPLAY " ✅ CICS map received successfully" PERFORM PROCESS-CUSTOMER-INPUT WHEN DFHRESP(MAPFAIL) DISPLAY " ⚠️ Map receive failed - no data entered" PERFORM HANDLE-NO-INPUT WHEN DFHRESP(INVREQ) DISPLAY " ❌ Invalid RECEIVE request" PERFORM HANDLE-INVALID-REQUEST WHEN OTHER DISPLAY " ❌ Unexpected CICS error: " WS-RESPONSE-CODE PERFORM HANDLE-CICS-ERROR END-EVALUATE *> CICS COMMAREA processing MOVE LENGTH OF WS-COMMAREA TO WS-COMMAREA-LENGTH RECEIVE INTO(WS-COMMAREA) LENGTH(WS-COMMAREA-LENGTH) RESP(WS-RESPONSE-CODE) END-RECEIVE IF WS-RESPONSE-CODE = DFHRESP(NORMAL) DISPLAY " ✅ COMMAREA received: " WS-COMMAREA(1:20) "..." PERFORM PROCESS-COMMAREA-DATA ELSE DISPLAY " ⚠️ COMMAREA reception issue: " WS-RESPONSE-CODE END-IF DISPLAY SPACES. PROCESS-CUSTOMER-INPUT. DISPLAY " Customer Input Processing:" DISPLAY " Customer Number: " CI-CUSTOMER-NUMBER DISPLAY " Customer Name: " CI-CUSTOMER-NAME DISPLAY " Phone: " CI-PHONE-NUMBER DISPLAY " Email: " CI-EMAIL-ADDRESS DISPLAY " Action: " CI-ACTION-CODE *> Validate customer input IF CI-CUSTOMER-NUMBER = SPACES DISPLAY " ❌ Customer number required" PERFORM SET-ERROR-MESSAGE ELSE IF CI-ACTION-CODE = "ADD " PERFORM ADD-CUSTOMER ELSE IF CI-ACTION-CODE = "UPD " PERFORM UPDATE-CUSTOMER ELSE IF CI-ACTION-CODE = "DEL " PERFORM DELETE-CUSTOMER ELSE DISPLAY " ❌ Invalid action code: " CI-ACTION-CODE END-IF END-IF. DEMONSTRATE-MESSAGE-QUEUE-RECEIVE. DISPLAY "=== MESSAGE QUEUE RECEIVE OPERATIONS ===" DISPLAY SPACES DISPLAY "Processing message queue operations..." *> Initialize queue parameters MOVE "ORDER.PROCESSING.QUEUE" TO WS-QUEUE-NAME MOVE "QM.PRODUCTION" TO WS-QUEUE-MANAGER *> Message queue RECEIVE with timeout RECEIVE WS-MESSAGE-BUFFER FROM WS-QUEUE-NAME LENGTH WS-MESSAGE-LENGTH WAIT(30) MESSAGE-ID(WS-MESSAGE-ID) CORRELATION-ID(WS-CORRELATION-ID) ON EXCEPTION EVALUATE TRUE WHEN WS-RESPONSE-CODE = TIMEOUT-CODE DISPLAY " ⏰ Queue receive timeout (30 seconds)" PERFORM HANDLE-TIMEOUT WHEN WS-RESPONSE-CODE = QUEUE-EMPTY DISPLAY " 📭 Queue is empty" PERFORM HANDLE-EMPTY-QUEUE WHEN OTHER DISPLAY " ❌ Queue error: " WS-RESPONSE-CODE PERFORM HANDLE-QUEUE-ERROR END-EVALUATE NOT ON EXCEPTION DISPLAY " ✅ Queue message received" DISPLAY " Message ID: " WS-MESSAGE-ID DISPLAY " Correlation ID: " WS-CORRELATION-ID DISPLAY " Length: " WS-MESSAGE-LENGTH PERFORM PROCESS-QUEUE-MESSAGE END-RECEIVE DISPLAY SPACES. PROCESS-QUEUE-MESSAGE. *> Parse message based on business format MOVE WS-MESSAGE-BUFFER TO WS-ORDER-MESSAGE DISPLAY " Order Message Processing:" DISPLAY " Order ID: " ORDER-ID DISPLAY " Customer ID: " CUSTOMER-ID DISPLAY " Order Date: " ORDER-DATE DISPLAY " Amount: $" ORDER-AMOUNT DISPLAY " Status: " ORDER-STATUS *> Business logic processing EVALUATE ORDER-STATUS WHEN "NEW " PERFORM PROCESS-NEW-ORDER WHEN "PENDING " PERFORM PROCESS-PENDING-ORDER WHEN "CANCELLED " PERFORM PROCESS-CANCELLED-ORDER WHEN OTHER DISPLAY " ⚠️ Unknown order status: " ORDER-STATUS END-EVALUATE. DEMONSTRATE-XML-MESSAGE-RECEIVE. DISPLAY "=== XML MESSAGE RECEIVE OPERATIONS ===" DISPLAY SPACES DISPLAY "Processing XML/Web service messages..." MOVE 8000 TO WS-XML-LENGTH *> Receive XML message from web service RECEIVE WS-XML-BUFFER FROM WEB-SERVICE-ENDPOINT SIZE IN WS-XML-LENGTH NODATA ON EXCEPTION DISPLAY " ❌ XML message reception failed" DISPLAY " Error code: " WS-RESPONSE-CODE PERFORM HANDLE-XML-ERROR NOT ON EXCEPTION DISPLAY " ✅ XML message received" DISPLAY " XML Length: " WS-XML-LENGTH " bytes" PERFORM PARSE-XML-MESSAGE PERFORM PROCESS-XML-DATA END-RECEIVE DISPLAY SPACES. PARSE-XML-MESSAGE. *> Extract XML elements (simplified parsing) IF WS-XML-BUFFER(1:5) = " Extract root element PERFORM EXTRACT-ROOT-ELEMENT *> Extract namespace if present PERFORM EXTRACT-NAMESPACE DISPLAY " Root Element: " WS-XML-ROOT-ELEMENT DISPLAY " Namespace: " WS-XML-NAMESPACE ELSE DISPLAY " ⚠️ Invalid XML format" PERFORM HANDLE-INVALID-XML END-IF. DEMONSTRATE-ASYNC-PROCESSING. DISPLAY "=== ASYNCHRONOUS RECEIVE PROCESSING ===" DISPLAY SPACES DISPLAY "Processing asynchronous message operations..." *> Multiple message processing with retry logic MOVE 0 TO WS-RETRY-COUNT PERFORM UNTIL WS-RETRY-COUNT >= WS-MAX-RETRIES RECEIVE WS-MESSAGE-BUFFER FROM ASYNC-MESSAGE-QUEUE SIZE IN WS-MESSAGE-LENGTH NOWAIT ON EXCEPTION ADD 1 TO WS-RETRY-COUNT DISPLAY " ⏳ Retry " WS-RETRY-COUNT " of " WS-MAX-RETRIES IF WS-RETRY-COUNT < WS-MAX-RETRIES PERFORM WAIT-BEFORE-RETRY ELSE DISPLAY " ❌ Maximum retries exceeded" PERFORM HANDLE-MAX-RETRIES END-IF NOT ON EXCEPTION DISPLAY " ✅ Async message received on attempt " WS-RETRY-COUNT + 1 PERFORM PROCESS-ASYNC-MESSAGE MOVE WS-MAX-RETRIES TO WS-RETRY-COUNT *> Exit loop END-RECEIVE END-PERFORM DISPLAY SPACES. DEMONSTRATE-ERROR-HANDLING. DISPLAY "=== RECEIVE ERROR HANDLING ===" DISPLAY SPACES DISPLAY "Testing comprehensive error scenarios..." *> Test various error conditions PERFORM TEST-INVALID-QUEUE PERFORM TEST-MESSAGE-TOO-LARGE PERFORM TEST-NETWORK-TIMEOUT PERFORM TEST-AUTHORIZATION-FAILURE DISPLAY " 📊 Error handling demonstration complete" DISPLAY SPACES. TEST-INVALID-QUEUE. MOVE "INVALID.QUEUE.NAME" TO WS-QUEUE-NAME RECEIVE WS-MESSAGE-BUFFER FROM WS-QUEUE-NAME SIZE IN WS-MESSAGE-LENGTH ON EXCEPTION DISPLAY " ✅ Invalid queue error handled correctly" DISPLAY " Error: " WS-STATUS-MESSAGE NOT ON EXCEPTION DISPLAY " ⚠️ Expected error not triggered" END-RECEIVE. DISPLAY-PROCESSING-SUMMARY. DISPLAY "=== RECEIVE PROCESSING SUMMARY ===" DISPLAY SPACES DISPLAY "Processing Statistics:" DISPLAY " 📨 Messages received: " WS-MESSAGES-RECEIVED DISPLAY " ✅ Messages processed: " WS-MESSAGES-PROCESSED DISPLAY " ❌ Messages failed: " WS-MESSAGES-FAILED DISPLAY " 📊 Total bytes processed: " WS-TOTAL-BYTES IF WS-MESSAGES-RECEIVED > 0 COMPUTE WS-PROCESSING-TIME = (WS-MESSAGES-PROCESSED / WS-MESSAGES-RECEIVED) * 100 DISPLAY " 📈 Success rate: " WS-PROCESSING-TIME "%" END-IF DISPLAY " " DISPLAY "RECEIVE Features Demonstrated:" DISPLAY " ✓ Basic message reception" DISPLAY " ✓ CICS terminal communication" DISPLAY " ✓ Message queue processing" DISPLAY " ✓ XML/Web service integration" DISPLAY " ✓ Asynchronous processing" DISPLAY " ✓ Comprehensive error handling" DISPLAY " ✓ Retry mechanisms" DISPLAY " ✓ Timeout management" DISPLAY SPACES. *> Error handling paragraphs LOG-ERROR-DETAILS. ADD 1 TO WS-MESSAGES-FAILED DISPLAY " Error Details:" DISPLAY " Time: " FUNCTION CURRENT-DATE DISPLAY " Queue: " WS-QUEUE-NAME DISPLAY " Expected Size: " WS-MAX-MESSAGE-SIZE DISPLAY " Status: " WS-STATUS-MESSAGE. HANDLE-TIMEOUT. DISPLAY " Timeout handling - checking for alternate sources". HANDLE-EMPTY-QUEUE. DISPLAY " Queue empty - scheduling retry". WAIT-BEFORE-RETRY. DISPLAY " Waiting 5 seconds before retry..." *> In real implementation, would include actual wait logic PROCESS-ASYNC-MESSAGE. DISPLAY " Processing asynchronous message content". EXTRACT-ROOT-ELEMENT. *> Simplified XML root extraction MOVE "CustomerData" TO WS-XML-ROOT-ELEMENT. EXTRACT-NAMESPACE. *> Simplified namespace extraction MOVE "http://company.com/customer" TO WS-XML-NAMESPACE.