Step through the server program SRV001, in COBOL pseudocode, as it determines why it was called, carries out housekeeping, and performs its work.
Identification Division.
Program-id. SRV001.
Environment Division.
Data Division.
Working-Storage Section.
01 Event-Name pic x(16).
88 DFH-Initial value 'DFHINITIAL'.
88 SRV-Request value 'SRV-REQUEST'.
01 Sub-Event-Name pic x(16).
88 SRV-Work value 'SRV-WORK'.
88 SRV-Shutdown value 'SRV-SHUTDOWN'.
01 Input-Buffer.
.
01 Output-Buffer.
.
01 State-Buffer.
.
Linkage Section.
01 DFHEIBLK.
.
Procedure Division.
Begin-Process.
.
EXEC CICS RETRIEVE REATTACH EVENT(Event-Name)
RESP(data-area) RESP2(data-area) END-EXEC
.
Evaluate True
When DFH-Initial
Perform Initial-Request
Perform Server-work
When SRV-Request
Perform Server-Event
When Other
.
End Evaluate.
.
EXEC CICS RETURN END-EXEC
.
Server-Event.
.
EXEC CICS RETRIEVE SUBEVENT(Sub-Event-Name) EVENT(Event-Name)
RESP(data-area) RESP2(data-area) END-EXEC
.
Evaluate True
When SRV-Work
Perform Server-Work
When SRV-Shutdown
Perform Server-Shutdown
When Other
.
End Evaluate.
.
Initial-Request.
.
EXEC CICS DEFINE INPUT EVENT('SRV-WORK')
RESP(data-area) RESP2(data-area) END-EXEC
.
EXEC CICS DEFINE INPUT EVENT('SRV-SHUTDOWN')
RESP(data-area) RESP2(data-area) END-EXEC
.
EXEC CICS DEFINE COMPOSITE EVENT('SRV-REQUEST') OR
SUBEVENT1('SRV-WORK')
SUBEVENT2('SRV-SHUTDOWN')
RESP(data-area) RESP2(data-area) END-EXEC
.
Server-Work.
.
EXEC CICS GET CONTAINER('Server-In') INTO(Input-Buffer)
RESP(data-area) RESP2(data-area) END-EXEC
.
If DFH-Initial
EXEC CICS DEFINE ACTIVITY('Work')
TRANSID('SWRK')
PROGRAM('PRG002')
RESP(data-area) RESP2(data-area) END-EXEC
.
Else
EXEC CICS GET CONTAINER('Previous-State') INTO(State-Buffer)
RESP(data-area) RESP2(data-area) END-EXEC
.
End-If.
.
EXEC CICS PUT CONTAINER('Work-Input')
ACTIVITY('Work') FROM(Input-Buffer)
RESP(data-area) RESP2(data-area) END-EXEC
.
EXEC CICS RUN ACTIVITY('Work')
SYNCHRONOUS
RESP(data-area) RESP2(data-area) END-EXEC
EXEC CICS CHECK ACTIVITY('Work') COMPSTATUS(status)
RESP(RC) RESP2(data-area) END-EXEC
.
If RC NOT = DFHRESP(NORMAL)
.
End-If.
.
If status NOT = DFHVALUE(NORMAL)
.
End-If.
.
EXEC CICS GET CONTAINER('Work-Output')
ACTIVITY('Work') INTO(Output-Buffer)
RESP(data-area) RESP2(data-area) END-EXEC
.
EXEC CICS PUT CONTAINER('Previous-State') FROM(State-Buffer)
RESP(data-area) RESP2(data-area) END-EXEC
.
EXEC CICS PUT CONTAINER('Server-Output') FROM(Output-Buffer)
RESP(data-area) RESP2(data-area) END-EXEC
.
Server-Shutdown.
EXEC CICS DELETE EVENT('SRV-WORK')
RESP(data-area) RESP2(data-area) END-EXEC
.
EXEC CICS DELETE EVENT('SRV-SHUTDOWN')
RESP(data-area) RESP2(data-area) END-EXEC
.
EXEC CICS DELETE EVENT('SRV-REQUEST')
RESP(data-area) RESP2(data-area) END-EXEC
.
EXEC CICS RETURN ENDACTIVITY
RESP(data-area) RESP2(data-area) END-EXEC
End Program.
EXEC CICS DEFINE INPUT EVENT('SRV-WORK')
RESP(data-area) RESP2(data-area) END-EXEC
.
EXEC CICS DEFINE INPUT EVENT('SRV-SHUTDOWN')
RESP(data-area) RESP2(data-area) END-EXEC
.
EXEC CICS DEFINE COMPOSITE EVENT('SRV-REQUEST') OR
SUBEVENT1('SRV-WORK')
SUBEVENT2('SRV-SHUTDOWN')
RESP(data-area) RESP2(data-area) END-EXEC
.
The DEFINE COMPOSITE EVENT command defines a third, composite, event (SRV-REQUEST), and adds the two input events to it. Because the composite event uses the OR Boolean operator, it fires when either of the two input events fires; SRV001 is reattached.
SRV001 obtains its input data from a data-container named Server-In. It then performs the work activity Work.
When the work activity has completed, SRV001 saves some state data for the next time it is run, and returns the output data produced by the work activity to the client program in a data-container named Server-Output.
On subsequent invocations, SRV001 determines that it has been invoked to perform work. (The RETRIEVE REATTACH EVENT command returns the composite event SRV-REQUEST, and a RETRIEVE SUBEVENT command with an event-name of SRV-REQUEST returns the subevent SRV-WORK.)
Eventually, the RETRIEVE SUBEVENT command returns the subevent SRV-SHUTDOWN, and SRV001 responds by ending the server process. First it deletes the user events that it has defined, then issues an EXEC CICS® RETURN ENDACTIVITY command to indicate that it has completed all its processing.