Titolo: Uscita corretta da 4D Server con Stored procedure
Categoria: Codice |
|
Ultimo Aggiornamento: 28/01/05 |
Una stored procedure è un processo lanciato sulla macchina server.
L'utilizzo di questa tecnica è molto spesso indicato perché limita la comunicazione via network fra client e server.
Una stored procedure può essere lanciata:
- da 4D Server, usando il comando New process;
- da 4D Client, usando il comando Execute on server.
Vediamo di usarla per eseguire una corretta uscita da 4D Server.
Nel database method "On Server Startup" inseriamo questo codice:
<>StopServer:=
False<>StoredProc:=New process("Server_Method";32*1024;"StoredProc (server)")
Il metodo "Server_Method" non fa altro che un ciclo molto semplice, che dura finché <>StopServer non diventa "Vero"
Repeat $currentTime:=Current time
DELAY PROCESS(Current process;60)
Until (<>StopServer=
True)
Ora, esistono due modi, come ben sappiamo di uscire da 4D Server:
- "Disconnect from server in nn min." è sicuramente il più pericoloso: trascorso il numero di minuti TUTTI I PROCESSI VERRANNO CHIUSI, con grosso rischio, ovviamente di integrità del database;
- "Wait for all Users to disconnect" attende che tutti i client vengano chiusi.
Se viene usato questo secondo sistema di chiusura del server, è possibile usare la variabile <>StopServer impostata precedentemente per controllare nelle varie stored procedures se il server sta o meno per chiudersi.
Per fare in modo che 4D Server attenda la conclusione dei vari processi si può usare questo codice nel database method "On Server Shutdown" (dobbiamo controllare tutti i processi possibili del server, quindi anche Web):
<>StopServer:=
True `inizializzo
$Index:=1
$nbUsersProcs:=5
$serverReady:=11
Repeat ` Quanti processi vivi?
$nbProcess:=Count user processes
` Condizione dei processi kernel
$interface:=ProcessExist (204;1) ` process 'User interface'
$client:=ProcessExist (204;2) ` process 'Client manager'
$cache:=ProcessExist (204;3) ` process 'Cache manager'
$web:=ProcessExist (401;1) ` process 'Web server'
$index:=ProcessExist (204;4) ` process 'Index manager'
` Una variabile che condensa gli stati
$serverReady:=$interface+$client+$cache+$web+$index
` Delay per 5 secondi
DELAY PROCESS(Current process;300)
Until (<>StopServer=
True) & ($index=0) & ($nbProcess<5) & ($serverReady<11)
Il metodo "ProcessExist" controlla lo stato dei processi kernel accedendo alle risorse:
` $1 => STR# number
` $2 => STR# item number
` $0 <= number
$0:=Process number(Get indexed string($1;$2))
Così, se $index è uguale a zero, significa che nessun processo di indicizzazione è in corso e il server può uscire.
Un altro approccio potrebbe essere quello di far lanciare un processo al client che controlli lo stato di <>StopServer, in modo che possa completare tutti i suoi processi prima che venga eseguito il comando "Quit 4D"
Inviato da: PierPaolo Sichera |
|
Visite: 12687 |
Se accedi con utente e password, puoi aggiungere dei commenti.