CICS activity processing is the execution and management of activities within Business Transaction Services (BTS) business processes. Activities are units of work that perform specific business functions, respond to events, manage state through containers, and can be compensated if needed. Understanding activity processing is essential for building reliable, long-running business applications in CICS.
Unlike traditional CICS transactions that are short-lived and stateless, BTS activities enable stateful, long-running business processes that can span multiple transactions, maintain persistent state, and provide automatic recovery and compensation capabilities.
Activity processing involves:
Activities follow a well-defined lifecycle from creation to completion:
| Lifecycle Stage | Description | Key Commands |
|---|---|---|
| Definition | Activity is defined in resource definitions | DEFINE ACTIVITY (RDO) |
| Start | Activity is started by parent or event | START, DEFINE ACTIVITY |
| Execution | Activity program executes business logic | GET CONTAINER, PUT CONTAINER, SIGNAL EVENT |
| Completion | Activity completes and signals events | SIGNAL EVENT, CHECK ACTIVITY |
| Compensation | Compensating activity may be triggered if needed | START (compensating activity) |
Activities are started using the START command or by defining child activities. Activities can be started by parent activities, event handlers, or external triggers.
123456789101112131415161718192021222324252627WORKING-STORAGE SECTION. 01 WS-RESPONSE PIC S9(8) COMP. 01 WS-RESPONSE2 PIC S9(8) COMP. 01 WS-ACTIVITY-ID PIC X(16). 01 WS-PROCESS-NAME PIC X(16) VALUE 'ORDER-PROCESS'. PROCEDURE DIVISION. *> Start a child activity MOVE 'ACTIVITY-001' TO WS-ACTIVITY-ID EXEC CICS START ACTIVITY('PROCESS-ORDER') PROCESS(WS-PROCESS-NAME) ACTIVITYID(WS-ACTIVITY-ID) RESP(WS-RESPONSE) RESP2(WS-RESPONSE2) END-EXEC IF WS-RESPONSE NOT EQUAL DFHRESP(NORMAL) EXEC CICS WRITE OPERATOR TEXT('Failed to start activity') END-EXEC EXEC CICS RETURN END-EXEC END-IF. *> Activity started successfully *> The activity program will execute and can access containers
123456789101112131415161718PROCEDURE DIVISION. *> Define a child activity within the current process EXEC CICS DEFINE ACTIVITY('VALIDATE-ORDER') PROCESS(WS-PROCESS-NAME) ACTIVITYID('VALIDATE-001') PARENT(WS-CURRENT-ACTIVITY-ID) RESP(WS-RESPONSE) END-EXEC IF WS-RESPONSE EQUAL DFHRESP(NORMAL) *> Start the child activity EXEC CICS START ACTIVITY('VALIDATE-ORDER') PROCESS(WS-PROCESS-NAME) ACTIVITYID('VALIDATE-001') RESP(WS-RESPONSE) END-EXEC END-IF.
Once started, an activity executes its associated program. The activity program can access containers, signal events, and perform business logic.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546WORKING-STORAGE SECTION. 01 WS-ORDER-DATA. 05 WS-ORDER-NUMBER PIC X(10). 05 WS-CUSTOMER-ID PIC X(8). 05 WS-ORDER-AMOUNT PIC S9(9)V99 COMP-3. 01 WS-CONTAINER-LENGTH PIC S9(8) COMP. 01 WS-RESPONSE PIC S9(8) COMP. PROCEDURE DIVISION. *> Activity program execution *> Get input data from container EXEC CICS GET CONTAINER('ORDER-INPUT') INTO(WS-ORDER-DATA) FLENGTH(WS-CONTAINER-LENGTH) BTS RESP(WS-RESPONSE) END-EXEC IF WS-RESPONSE NOT EQUAL DFHRESP(NORMAL) EXEC CICS SIGNAL EVENT('ORDER-ERROR') PROCESS(WS-PROCESS-NAME) END-EXEC EXEC CICS RETURN END-EXEC END-IF *> Process the order PERFORM VALIDATE-ORDER PERFORM CALCULATE-TOTALS PERFORM UPDATE-INVENTORY *> Store results in output container EXEC CICS PUT CONTAINER('ORDER-RESULT') FROM(WS-ORDER-DATA) FLENGTH(LENGTH OF WS-ORDER-DATA) BTS RESP(WS-RESPONSE) END-EXEC *> Signal completion event EXEC CICS SIGNAL EVENT('ORDER-PROCESSED') PROCESS(WS-PROCESS-NAME) RESP(WS-RESPONSE) END-EXEC EXEC CICS RETURN END-EXEC.
Events are the primary mechanism for coordinating activities. Activities can signal events to trigger other activities or indicate completion.
12345678910111213141516171819202122PROCEDURE DIVISION. *> Signal a completion event EXEC CICS SIGNAL EVENT('VALIDATION-COMPLETE') PROCESS(WS-PROCESS-NAME) RESP(WS-RESPONSE) END-EXEC *> Signal an error event IF WS-ERROR-OCCURRED EXEC CICS SIGNAL EVENT('VALIDATION-ERROR') PROCESS(WS-PROCESS-NAME) RESP(WS-RESPONSE) END-EXEC END-IF *> Signal event with data EXEC CICS SIGNAL EVENT('ORDER-APPROVED') PROCESS(WS-PROCESS-NAME) FROM(WS-APPROVAL-DATA) FLENGTH(LENGTH OF WS-APPROVAL-DATA) RESP(WS-RESPONSE) END-EXEC.
123456789101112131415161718PROCEDURE DIVISION. *> Wait for a specific event EXEC CICS WAIT EVENT('PAYMENT-RECEIVED') PROCESS(WS-PROCESS-NAME) TIMEOUT(WS-TIMEOUT-VALUE) RESP(WS-RESPONSE) END-EXEC IF WS-RESPONSE EQUAL DFHRESP(NORMAL) *> Event received, continue processing PERFORM PROCESS-PAYMENT ELSE IF WS-RESPONSE EQUAL DFHRESP(TIMEOUT) *> Timeout occurred PERFORM HANDLE-TIMEOUT ELSE *> Error occurred PERFORM HANDLE-ERROR END-IF.
Containers are named storage areas that hold data shared between activities. They persist across transaction boundaries and enable state management in long-running processes.
12345678910111213141516PROCEDURE DIVISION. *> Store order data in container EXEC CICS PUT CONTAINER('ORDER-DATA') FROM(WS-ORDER-RECORD) FLENGTH(LENGTH OF WS-ORDER-RECORD) BTS RESP(WS-RESPONSE) END-EXEC *> Store customer information EXEC CICS PUT CONTAINER('CUSTOMER-INFO') FROM(WS-CUSTOMER-RECORD) FLENGTH(LENGTH OF WS-CUSTOMER-RECORD) BTS RESP(WS-RESPONSE) END-EXEC.
1234567891011121314151617181920WORKING-STORAGE SECTION. 01 WS-ORDER-DATA PIC X(200). 01 WS-CONTAINER-LENGTH PIC S9(8) COMP. PROCEDURE DIVISION. *> Retrieve order data from container EXEC CICS GET CONTAINER('ORDER-DATA') INTO(WS-ORDER-DATA) FLENGTH(WS-CONTAINER-LENGTH) BTS RESP(WS-RESPONSE) END-EXEC IF WS-RESPONSE EQUAL DFHRESP(NORMAL) *> Process the retrieved data PERFORM PROCESS-ORDER-DATA ELSE IF WS-RESPONSE EQUAL DFHRESP(NOTFND) *> Container not found PERFORM HANDLE-MISSING-CONTAINER END-IF.
Compensation allows activities to be reversed if a business process fails. Each activity that modifies data should have a corresponding compensating activity.
1234567891011121314151617181920212223242526272829303132333435363738PROCEDURE DIVISION. *> Main activity: Reserve inventory RESERVE-INVENTORY-ACTIVITY. EXEC CICS GET CONTAINER('ORDER-DATA') INTO(WS-ORDER-DATA) BTS END-EXEC *> Reserve inventory items PERFORM RESERVE-INVENTORY-ITEMS *> Store compensation data EXEC CICS PUT CONTAINER('RESERVATION-DATA') FROM(WS-RESERVATION-RECORD) FLENGTH(LENGTH OF WS-RESERVATION-RECORD) BTS END-EXEC *> Signal completion EXEC CICS SIGNAL EVENT('INVENTORY-RESERVED') PROCESS(WS-PROCESS-NAME) END-EXEC. *> Compensating activity: Release inventory RELEASE-INVENTORY-ACTIVITY. *> Get reservation data EXEC CICS GET CONTAINER('RESERVATION-DATA') INTO(WS-RESERVATION-RECORD) BTS END-EXEC *> Reverse the reservation PERFORM RELEASE-INVENTORY-ITEMS *> Signal compensation complete EXEC CICS SIGNAL EVENT('INVENTORY-RELEASED') PROCESS(WS-PROCESS-NAME) END-EXEC.
Activities can be monitored to check their status and retrieve information about their execution.
1234567891011121314151617181920212223242526WORKING-STORAGE SECTION. 01 WS-ACTIVITY-STATUS PIC X(16). 01 WS-RESPONSE PIC S9(8) COMP. PROCEDURE DIVISION. *> Check if activity has completed EXEC CICS CHECK ACTIVITY('PROCESS-ORDER') PROCESS(WS-PROCESS-NAME) ACTIVITYID(WS-ACTIVITY-ID) STATUS(WS-ACTIVITY-STATUS) RESP(WS-RESPONSE) END-EXEC IF WS-RESPONSE EQUAL DFHRESP(NORMAL) EVALUATE WS-ACTIVITY-STATUS WHEN 'ACTIVE' DISPLAY 'Activity is still running' WHEN 'COMPLETE' DISPLAY 'Activity completed successfully' WHEN 'FAILED' DISPLAY 'Activity failed' PERFORM TRIGGER-COMPENSATION WHEN OTHER DISPLAY 'Activity status: ' WS-ACTIVITY-STATUS END-EVALUATE END-IF.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374IDENTIFICATION DIVISION. PROGRAM-ID. ORDER-PROCESSING-ACTIVITY. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-PROCESS-NAME PIC X(16) VALUE 'ORDER-BP'. 01 WS-ACTIVITY-ID PIC X(16). 01 WS-RESPONSE PIC S9(8) COMP. 01 WS-RESPONSE2 PIC S9(8) COMP. 01 WS-ORDER-DATA. 05 WS-ORDER-NUMBER PIC X(10). 05 WS-CUSTOMER-ID PIC X(8). 05 WS-ORDER-AMOUNT PIC S9(9)V99 COMP-3. 05 WS-ORDER-STATUS PIC X(1). PROCEDURE DIVISION. MAIN-ACTIVITY. *> Get order data from input container EXEC CICS GET CONTAINER('ORDER-INPUT') INTO(WS-ORDER-DATA) FLENGTH(LENGTH OF WS-ORDER-DATA) BTS RESP(WS-RESPONSE) END-EXEC IF WS-RESPONSE NOT EQUAL DFHRESP(NORMAL) EXEC CICS SIGNAL EVENT('ORDER-ERROR') PROCESS(WS-PROCESS-NAME) END-EXEC EXEC CICS RETURN END-EXEC END-IF *> Validate order PERFORM VALIDATE-ORDER IF WS-ORDER-STATUS = 'V' *> Order valid - process it PERFORM PROCESS-ORDER *> Store results EXEC CICS PUT CONTAINER('ORDER-RESULT') FROM(WS-ORDER-DATA) FLENGTH(LENGTH OF WS-ORDER-DATA) BTS RESP(WS-RESPONSE) END-EXEC *> Signal success EXEC CICS SIGNAL EVENT('ORDER-PROCESSED') PROCESS(WS-PROCESS-NAME) RESP(WS-RESPONSE) END-EXEC ELSE *> Order invalid EXEC CICS SIGNAL EVENT('ORDER-REJECTED') PROCESS(WS-PROCESS-NAME) RESP(WS-RESPONSE) END-EXEC END-IF EXEC CICS RETURN END-EXEC. VALIDATE-ORDER. *> Validation logic IF WS-ORDER-AMOUNT > 0 AND WS-CUSTOMER-ID NOT = SPACES MOVE 'V' TO WS-ORDER-STATUS ELSE MOVE 'I' TO WS-ORDER-STATUS END-IF. PROCESS-ORDER. *> Business logic for processing order CONTINUE.
Each activity should perform a single, well-defined business function. This makes activities easier to understand, test, and maintain.
Store all state data in containers rather than program variables. Containers persist across transaction boundaries and enable long-running processes.
For activities that modify data, always provide a compensating activity that can reverse the effects. This enables reliable error recovery.
Signal events to indicate activity completion, errors, and significant milestones. This enables proper workflow coordination.
Check response codes after all BTS commands and signal appropriate error events. Implement proper error handling and recovery mechanisms.
Imagine you're building a toy with many steps:
Activity processing is like doing each step of building your toy. First you put on the wheels (one activity), then you attach the body (another activity), then you add the decorations (another activity). Each step is an activity that does one specific thing.
If something goes wrong, you can undo a step (compensation) - like taking off the wheels if you put them on wrong. The activities talk to each other through messages (events) - like "wheels are done, now you can attach the body!"
Just like building a toy step by step, CICS activities do business work step by step, and if something goes wrong, they can undo their work!
Write code to start a child activity named 'VALIDATE-CUSTOMER' in process 'ORDER-BP' with activity ID 'VALID-001'.
123456EXEC CICS START ACTIVITY('VALIDATE-CUSTOMER') PROCESS('ORDER-BP') ACTIVITYID('VALID-001') RESP(WS-RESPONSE) END-EXEC.
Write an activity that gets data from container 'INPUT-DATA', processes it, stores results in container 'OUTPUT-DATA', and signals event 'PROCESSING-COMPLETE'.
123456789101112131415161718192021222324*> Get input EXEC CICS GET CONTAINER('INPUT-DATA') INTO(WS-INPUT-DATA) FLENGTH(LENGTH OF WS-INPUT-DATA) BTS RESP(WS-RESPONSE) END-EXEC *> Process data PERFORM PROCESS-DATA *> Store output EXEC CICS PUT CONTAINER('OUTPUT-DATA') FROM(WS-OUTPUT-DATA) FLENGTH(LENGTH OF WS-OUTPUT-DATA) BTS RESP(WS-RESPONSE) END-EXEC *> Signal completion EXEC CICS SIGNAL EVENT('PROCESSING-COMPLETE') PROCESS(WS-PROCESS-NAME) RESP(WS-RESPONSE) END-EXEC.
1. What is an activity in CICS BTS?
2. How do activities share data in CICS BTS?
3. What is activity compensation?
4. How are activities started in CICS BTS?
5. What happens when an activity signals an event?