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
ilWait | input | logical | Wait after sending stop request to daemons? |
ocMessage | output | character | Message when processing error. |
oiReturnStatus | output | integer | Return status of the method. |
Internal usage
BLF
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.