project BLF > class TApplication > method StopApplication

Description

This method should be used at the moment the application should be stopped. It takes care of stopping ALL the daemons.


Parameters


ilWaitinputlogicalWait after sending stop request to daemons?
ocMessageoutputcharacterMessage when processing error.
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


BLF
method TApplication.ExecuteAction


program code (program1/tapplication.p)

/* ================================================================================ */
/* Logging                                                                          */
/* ================================================================================ */
<M-28 run GetLogFileLocation  (output vcLogFile (ocLogFile)) in TApplication>

output to value (vcLogFile) append.
put '':U  skip.
put unformatted string (now) '> ':U
    'TApplication.StopApplication: Start (ilWait= ' ilWait ').' skip.
output close.

/* Send a stop request to all running daemons */
<Q-8 run DaemonLoginInfo (all) (Read) (NoCache)
          (input '', (DaemonName)
           output dataset tqDaemonLoginInfo) in BBaseDaemon >

/* code copied from business.startpersistence */
run StartPersistenceInPool (input {&TARGETPROCEDURE},
                            output vhPL,
                            output viFcReturnSuper).
if viFcReturnSuper < 0
then do :
    assign ocMessage = trim(#T-6'Cannot activate the persistence layer.':120(4389)t-6#)
           oiReturnStatus = -3.
    return.
end.

if not can-find (first tqDaemonLoginInfo where
                       tqDaemonLoginInfo.tcDaemonStatus = {&DAEMONSTATUS-RUNNING})
then do :
    /* ================================================================================ */
    /* Logging                                                                          */
    /* ================================================================================ */
    output to value (vcLogFile) append.
    put unformatted string (now) '> ':U
        'TApplication.StopApplication: No Daemon with status "Running" found.' skip.
    output close.
end.
else do :
    if ilWait
    then do:
        <M-25 run Main  (input  viSessionId (iiSessionId)) in TDaemonUtility>
        vhDU = vhFcComponent.
    end.
    
    for each tqDaemonLoginInfo where
             tqDaemonLoginInfo.tcDaemonStatus = {&DAEMONSTATUS-RUNNING}:
        
        if ilWait
        then do:
            vhFcComponent = vhDU.
            <M-38 run ProcessIsValid
               (input  tqDaemonLoginInfo.tcDaemonName (icDaemonName), 
                input  (if num-entries(entry (1,tqDaemonLoginInfo.tcDaemonProcessIDs),':') = 2 then entry (1,entry (1,tqDaemonLoginInfo.tcDaemonProcessIDs),':') else '') (icProcessHostname), 
                input  (if num-entries(entry (1,tqDaemonLoginInfo.tcDaemonProcessIDs),':') = 2 then integer (entry (2,entry (1,tqDaemonLoginInfo.tcDaemonProcessIDs),':')) else integer(entry (1,tqDaemonLoginInfo.tcDaemonProcessIDs))) (iiProcessNr), 
                input  '' (icDaemonAppserverURL), 
                output vlValid (olValid), 
                output vcValidMessage (ocMessage), 
                output viFcReturnSuper (oiReturnStatus)) in TDaemonUtility>
        end.
        else vlValid = no.
        
        /* ================================================================================ */
        /* Logging                                                                          */
        /* ================================================================================ */
        output to value (vcLogFile) append.
        put unformatted string (now) '> ':U
            'TApplication.StopApplication: Daemon= ' tqDaemonLoginInfo.tcDaemonName 
            ' Status= ' (if vlValid then 'running' else vcValidMessage) skip.
        output close.

        if vlValid
        then do:
            vcDaemonList = vcDaemonList + "," + tqDaemonLoginInfo.tcDaemonName.
            vhFcComponent = vhPL.
            <M-5 run WriteDirect
               (input  'fcDaemon':U (icTableName), 
                input  'for each fcDaemon where fcDaemon.DaemonId = ':U + string(tqDaemonLoginInfo.tiDaemonId) (icPrepare), 
                input  'DaemonStatus':U (icFieldList), 
                input  'c':U (icFieldListDataTypes), 
                input  {&DAEMONSTATUS-STOPPING} (icAbsolute), 
                input  '' (icIncremental), 
                input  {&TARGETPROCEDURE} (ihClass), 
                input  'StopApplication':U (icUserLogin), 
                output viFcReturnSuper (oiReturnStatus)) in persistence>
        end.
        else do:
            vhFcComponent = vhPL.
            <M-2 run WriteDirect
               (input  'fcDaemon':U (icTableName), 
                input  'for each fcDaemon where fcDaemon.DaemonId = ':U + string(tqDaemonLoginInfo.tiDaemonId) (icPrepare), 
                input  'DaemonStatus,DaemonRunningProcesses,DaemonProcessIDs':U (icFieldList), 
                input  'c,i,c':U (icFieldListDataTypes), 
                input  {&DAEMONSTATUS-INACTIVE} + chr(2) + '0' + chr(2) (icAbsolute), 
                input  '' (icIncremental), 
                input  {&TARGETPROCEDURE} (ihClass), 
                input  'StopApplication':U (icUserLogin), 
                output viFcReturnSuper (oiReturnStatus)) in persistence>
        end.
    end.
    
    if ilWait
    then do viretries = 1 to 20:
    
        /* Wait so that all daemons get the chance to close properly (max. 3 minutes) */
        
        /* ================================================================================ */
        /* Logging                                                                          */
        /* ================================================================================ */
        output to value (vcLogFile) append.
        put unformatted string (now) '> ':U
            'TApplication.StopApplication: waiting for ' (viretries * 10) ' seconds.' skip.
        output close.
    
        pause 10 no-message.

        <Q-73 run DaemonLoginInfo (all) (Read) (NoCache)
           (input '', (DaemonName)
            output dataset tqDaemonLoginInfo) in BBaseDaemon>
        if can-find (first tqDaemonLoginInfo where
                           tqDaemonLoginInfo.tcDaemonStatus = {&DAEMONSTATUS-STOPPING} and
                           lookup(tqDaemonLoginInfo.tcDaemonName,vcDaemonList) > 0)
        then do:
            output to value (vcLogFile) append.
            for each tqDaemonLoginInfo where
                     tqDaemonLoginInfo.tcDaemonStatus = {&DAEMONSTATUS-STOPPING} and
                     lookup(tqDaemonLoginInfo.tcDaemonName,vcDaemonList) > 0:
                put unformatted string (now) '> ':U
                    tqDaemonLoginInfo.tcDaemonName ' still running.' skip.
            end.
            output close.
        end.
        else leave.
    end.
end.

/* ================================================================================ */
/* Logging                                                                          */
/* ================================================================================ */
output to value (vcLogFile) append.
put unformatted string (now) '> ':U
    'TApplication.StopApplication: ended (oiReturnStatus= ' oiReturnStatus ', ocMessage= ' ocMessage ').' skip.
output close.

finally:
    if vhDU <> ?
    then do:
        run gipr_deleteprocedure in vhDU.
        delete procedure vhDU.
    end.
end finally.