GDS (General Data Stream) Process Management in CICS involves managing the lifecycle of APPC (Advanced Program-to-Program Communication) conversations. This includes allocating conversations, assigning attributes, managing data transfer, and properly terminating conversations. Understanding GDS process management is essential for building robust distributed applications in CICS environments.
GDS Process Management encompasses the complete lifecycle of General Data Stream conversations in CICS APPC environments. A GDS conversation is a logical connection between two programs running in different systems, allowing them to exchange data in a structured, controlled manner. Process management involves:
A GDS conversation follows a well-defined lifecycle with specific states and transitions:
The conversation begins with allocation, where a conversation identifier (CONVID) is obtained:
1234567891011121314151617181920212223242526WORKING-STORAGE SECTION. 01 WS-CONVERSATION-ID PIC S9(8) COMP. 01 WS-RESPONSE PIC S9(8) COMP. 01 WS-RESPONSE2 PIC S9(8) COMP. 01 WS-SYNCLEVEL PIC S9(4) COMP VALUE 2. 01 WS-MODE-NAME PIC X(8) VALUE 'CONV01'. PROCEDURE DIVISION. * Allocate a GDS conversation EXEC CICS GDS ALLOCATE SYNCLEVEL(WS-SYNCLEVEL) MODENAME(WS-MODE-NAME) CONVID(WS-CONVERSATION-ID) RESP(WS-RESPONSE) RESP2(WS-RESPONSE2) END-EXEC. IF WS-RESPONSE NOT EQUAL DFHRESP(NORMAL) EXEC CICS WRITE OPERATOR TEXT('GDS ALLOCATE failed') END-EXEC EXEC CICS RETURN END-EXEC END-IF. * Conversation allocated successfully * CONVID now contains the conversation identifier
Key Points:
After allocation, assign conversation attributes to configure behavior:
12345678910111213141516171819202122232425WORKING-STORAGE SECTION. 01 WS-CONVERSATION-ID PIC S9(8) COMP. 01 WS-RESPONSE PIC S9(8) COMP. 01 WS-ATTRIBUTES. 05 WS-SYNC-LEVEL PIC X(1) VALUE '2'. 05 WS-CONFIRM PIC X(1) VALUE 'Y'. 05 WS-DEALLOCATE PIC X(1) VALUE 'N'. PROCEDURE DIVISION. * Assign conversation attributes EXEC CICS GDS ASSIGN CONVID(WS-CONVERSATION-ID) ATTRIBUTES(WS-ATTRIBUTES) RESP(WS-RESPONSE) END-EXEC. IF WS-RESPONSE NOT EQUAL DFHRESP(NORMAL) EXEC CICS WRITE OPERATOR TEXT('GDS ASSIGN failed') END-EXEC EXEC CICS RETURN END-EXEC END-IF. * Conversation attributes assigned * Ready for data transfer
Once configured, send and receive data through the conversation:
12345678910111213141516171819202122232425262728293031323334353637WORKING-STORAGE SECTION. 01 WS-CONVERSATION-ID PIC S9(8) COMP. 01 WS-RESPONSE PIC S9(8) COMP. 01 WS-DATA-BUFFER PIC X(100). 01 WS-DATA-LENGTH PIC S9(4) COMP. PROCEDURE DIVISION. * Send data to partner MOVE 'Hello from CICS' TO WS-DATA-BUFFER MOVE 15 TO WS-DATA-LENGTH EXEC CICS GDS SEND CONVID(WS-CONVERSATION-ID) FROM(WS-DATA-BUFFER) LENGTH(WS-DATA-LENGTH) RESP(WS-RESPONSE) END-EXEC. IF WS-RESPONSE NOT EQUAL DFHRESP(NORMAL) EXEC CICS WRITE OPERATOR TEXT('GDS SEND failed') END-EXEC END-IF. * Receive data from partner EXEC CICS GDS RECEIVE CONVID(WS-CONVERSATION-ID) INTO(WS-DATA-BUFFER) LENGTH(WS-DATA-LENGTH) RESP(WS-RESPONSE) END-EXEC. IF WS-RESPONSE NOT EQUAL DFHRESP(NORMAL) EXEC CICS WRITE OPERATOR TEXT('GDS RECEIVE failed') END-EXEC END-IF.
For syncpoint-level conversations, use synchronization commands:
12345678910111213141516171819202122WORKING-STORAGE SECTION. 01 WS-CONVERSATION-ID PIC S9(8) COMP. 01 WS-RESPONSE PIC S9(8) COMP. PROCEDURE DIVISION. * Issue confirmation after processing EXEC CICS GDS ISSUE CONFIRMATION CONVID(WS-CONVERSATION-ID) RESP(WS-RESPONSE) END-EXEC. * Issue prepare for two-phase commit EXEC CICS GDS ISSUE PREPARE CONVID(WS-CONVERSATION-ID) RESP(WS-RESPONSE) END-EXEC. * Issue signal for state changes EXEC CICS GDS ISSUE SIGNAL CONVID(WS-CONVERSATION-ID) RESP(WS-RESPONSE) END-EXEC.
Properly terminate and free conversation resources:
123456789101112131415161718WORKING-STORAGE SECTION. 01 WS-CONVERSATION-ID PIC S9(8) COMP. 01 WS-RESPONSE PIC S9(8) COMP. PROCEDURE DIVISION. * Free the conversation EXEC CICS GDS FREE CONVID(WS-CONVERSATION-ID) RESP(WS-RESPONSE) END-EXEC. IF WS-RESPONSE NOT EQUAL DFHRESP(NORMAL) EXEC CICS WRITE OPERATOR TEXT('GDS FREE failed') END-EXEC END-IF. * Conversation resources released
GDS conversations support three synchronization levels, each providing different guarantees:
No synchronization or confirmation:
Confirmation required for data delivery:
Full transaction synchronization with syncpoint coordination:
GDS conversations exist in specific states that determine what operations are allowed:
Proper error handling is critical for robust GDS applications:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253WORKING-STORAGE SECTION. 01 WS-CONVERSATION-ID PIC S9(8) COMP. 01 WS-RESPONSE PIC S9(8) COMP. 01 WS-RESPONSE2 PIC S9(8) COMP. 01 WS-ERROR-MESSAGE PIC X(80). PROCEDURE DIVISION. EXEC CICS GDS SEND CONVID(WS-CONVERSATION-ID) FROM(WS-DATA-BUFFER) LENGTH(WS-DATA-LENGTH) RESP(WS-RESPONSE) RESP2(WS-RESPONSE2) END-EXEC. EVALUATE WS-RESPONSE WHEN DFHRESP(NORMAL) * Success - continue processing CONTINUE WHEN DFHRESP(INVREQ) * Invalid request - check parameters MOVE 'Invalid GDS request' TO WS-ERROR-MESSAGE PERFORM ERROR-HANDLER WHEN DFHRESP(NOTFND) * Conversation not found MOVE 'Conversation not found' TO WS-ERROR-MESSAGE PERFORM ERROR-HANDLER WHEN DFHRESP(CONVFAILURE) * Conversation failure MOVE 'Conversation failure occurred' TO WS-ERROR-MESSAGE PERFORM ERROR-HANDLER WHEN OTHER * Unexpected error MOVE 'Unexpected GDS error' TO WS-ERROR-MESSAGE PERFORM ERROR-HANDLER END-EVALUATE. ERROR-HANDLER. EXEC CICS WRITE OPERATOR TEXT(WS-ERROR-MESSAGE) END-EXEC. * Attempt to free conversation EXEC CICS GDS FREE CONVID(WS-CONVERSATION-ID) RESP(WS-RESPONSE) END-EXEC. EXEC CICS RETURN END-EXEC.
Here's a complete example demonstrating the full GDS conversation lifecycle:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110IDENTIFICATION DIVISION. PROGRAM-ID. GDSPROC01. AUTHOR. Mainframe Master. DATE-WRITTEN. 2024. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-CONVERSATION-ID PIC S9(8) COMP. 01 WS-RESPONSE PIC S9(8) COMP. 01 WS-RESPONSE2 PIC S9(8) COMP. 01 WS-SYNCLEVEL PIC S9(4) COMP VALUE 2. 01 WS-MODE-NAME PIC X(8) VALUE 'CONV01'. 01 WS-DATA-BUFFER PIC X(100). 01 WS-DATA-LENGTH PIC S9(4) COMP. 01 WS-END-OF-CONVERSATION PIC X(1) VALUE 'N'. PROCEDURE DIVISION. MAIN-PROCESSING. * Step 1: Allocate conversation EXEC CICS GDS ALLOCATE SYNCLEVEL(WS-SYNCLEVEL) MODENAME(WS-MODE-NAME) CONVID(WS-CONVERSATION-ID) RESP(WS-RESPONSE) RESP2(WS-RESPONSE2) END-EXEC. IF WS-RESPONSE NOT EQUAL DFHRESP(NORMAL) PERFORM ALLOCATION-ERROR EXEC CICS RETURN END-EXEC END-IF. * Step 2: Assign conversation attributes EXEC CICS GDS ASSIGN CONVID(WS-CONVERSATION-ID) RESP(WS-RESPONSE) END-EXEC. IF WS-RESPONSE NOT EQUAL DFHRESP(NORMAL) PERFORM ASSIGNMENT-ERROR EXEC CICS RETURN END-EXEC END-IF. * Step 3: Data transfer loop PERFORM UNTIL WS-END-OF-CONVERSATION = 'Y' * Send data MOVE 'Data from local system' TO WS-DATA-BUFFER MOVE 24 TO WS-DATA-LENGTH EXEC CICS GDS SEND CONVID(WS-CONVERSATION-ID) FROM(WS-DATA-BUFFER) LENGTH(WS-DATA-LENGTH) RESP(WS-RESPONSE) END-EXEC. IF WS-RESPONSE NOT EQUAL DFHRESP(NORMAL) PERFORM SEND-ERROR MOVE 'Y' TO WS-END-OF-CONVERSATION ELSE * Receive data EXEC CICS GDS RECEIVE CONVID(WS-CONVERSATION-ID) INTO(WS-DATA-BUFFER) LENGTH(WS-DATA-LENGTH) RESP(WS-RESPONSE) END-EXEC. IF WS-RESPONSE NOT EQUAL DFHRESP(NORMAL) PERFORM RECEIVE-ERROR MOVE 'Y' TO WS-END-OF-CONVERSATION END-IF END-IF * Issue confirmation EXEC CICS GDS ISSUE CONFIRMATION CONVID(WS-CONVERSATION-ID) RESP(WS-RESPONSE) END-EXEC END-PERFORM. * Step 4: Free conversation EXEC CICS GDS FREE CONVID(WS-CONVERSATION-ID) RESP(WS-RESPONSE) END-EXEC. EXEC CICS RETURN END-EXEC. ALLOCATION-ERROR. EXEC CICS WRITE OPERATOR TEXT('GDS ALLOCATE failed') END-EXEC. ASSIGNMENT-ERROR. EXEC CICS WRITE OPERATOR TEXT('GDS ASSIGN failed') END-EXEC. SEND-ERROR. EXEC CICS WRITE OPERATOR TEXT('GDS SEND failed') END-EXEC. RECEIVE-ERROR. EXEC CICS WRITE OPERATOR TEXT('GDS RECEIVE failed') END-EXEC.
Imagine you want to talk to your friend who lives far away:
Before you can talk, you need to call them on the phone (that's like ALLOCATE - you're setting up the connection). Once they answer, you might say "Hey, let's talk about our favorite games" (that's like ASSIGN - you're setting the rules for your conversation).
Then you take turns talking and listening (that's like SEND and RECEIVE - you're exchanging information). Sometimes you say "Did you hear me?" to make sure they got your message (that's like ISSUE CONFIRMATION - you're checking that everything is working).
When you're done talking, you say "Goodbye" and hang up (that's like FREE - you're ending the conversation and freeing up the phone line for someone else).
GDS Process Management is like managing a phone call between two computers. The computers need to set up the call, agree on how to talk, exchange information, make sure everything worked, and then hang up properly when they're done!
Write a COBOL program that:
Hint: Follow the complete example above, but implement your own error handling for each step.
Enhance the conversation lifecycle program to:
Compare the three synchronization levels:
Answer: Level 0 for non-critical high-volume data, Level 1 for most business applications needing confirmation, Level 2 for critical operations requiring full transaction integrity with syncpoint coordination.
1. What is the first step in GDS process management?
2. Which synchronization level provides the fastest data transfer?
3. What should you always do after a GDS conversation completes or encounters an error?
4. Which GDS command is used to configure conversation attributes?
5. What does sync level 2 provide that level 1 does not?