The server program

Step through the server program SRV001, in COBOL pseudocode, as it determines why it was called, carries out housekeeping, and performs its work.

Figure 1. Example server program, SRV001 (Part 1)
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
    .
Figure 2. Example server program, SRV001 (Part 2)
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
Figure 3. Example server program, SRV001 (Part 3)
    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.
The server program, SRV001, first issues a RETRIEVE REATTACH EVENT command to determine the reason for its invocation. On its first invocation, the event returned is DFHINITIAL, which tells SRV001 to perform any initial housekeeping. The housekeeping of the SRV001 program includes defining two input events for which it could later be invoked again:
    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.



dfhp9c0039.html | Timestamp icon Last updated: Thursday, 27 June 2019