Introduzione
In questa pagina viene descritto il modulo di gestione delle code in itaEngine.
Possiamo definire una coda come un'insieme di messaggi, che dovranno essere processati in ordine di inserimento (FIFO), al fine di rendere asincroni alcuni processi (Es. chiamate a web services).
Configurazione
Al file config.ini dovrà essere gestita la sesione [queue], che contiene le seguenti chiavi:
queueType: Indica il tipo di implementazione utilizzata. Attualmente l'unico valore possibile è “cache”.
cacheRoot: L'implementazione cache utilizzata è forzatamente “file”, in quanto “apc” vive solamente all'interno di un processo php che l'ha lanciata, quindi utilizzando la CLI per elaborare la coda, apc non sarà collegata ai dati di cache dell'applicativo, in quanto i processi sono differenti.
Descrizione delle singole componenti
Messaggio
Il messaggio rappresenta il singolo elemento della coda.
E' un'istanza della classe itaQueueMessage (presente in lib/itaPHPQueue/itaQueueMessage.class.php) ed ha le seguenti proprietà:
uuid: UUID del messaggio (chiave assegnata dal sistema)
alias: Alias che identifica univocamente il messaggio (assegnata dalla singola procedura)
data: Dati del messaggio
retries: Numero massimo di tentativi (in caso di errore durante esecuzione)
executionMode: Modalità di esecuzione (immediata/differita)
dateTimeDeferredExecution: Data e ora di esecuzione differita
disabled: Messaggio disabilitato
username: Nome utente utile per sapere chi ha inserito il messaggio in coda
Coda
La coda è composta dalle seguenti informazioni:
id: Identificativo coda (fisso in base alla tipologia, es. ANPR)
status: Contiene lo stato della coda
messages: Contiene la lista dei messaggi attualmente presenti nella coda
Lo stato, a sua volta, contiene le seguenti informazioni:
lastMessageInserted: informazioni riguardanti l'ultimo messaggio inserito (uuid, alias e timestamp)
lastMessageProcessed: informazioni riguardanti l'ultimo messaggio elaborato (uuid, alias e timestamp)
lastQueueModifyTime: Data/ora ultima modifica
messagesToProcess: numero di messaggi in coda da elaborare
customAttributes: attributi custom della coda (array associativo, gestione totalmente libera)
Gestore della Coda
Il gestore si occupa delle operazioni che andranno ad interagire con la coda.
L'implementazione specifica è determinata dal parametro “queueType” presente nel file di configurazione (Utilizzando apposita factory).
Attualmente l'unica implementazione possibile è quella fatta con la cache, la classe corrispondente è 'itaQueueManagerCache' (presente il lib/itaPHPQueue/ityaQueueManagerCache.class.php).
Il gestore della coda si occupa delle seguenti operazioni:
createQueue: Crea una nuova coda
destroyQueue: Distrugge coda
addMessage: Aggiunge un nuovo messaggio in coda
getMessage: Preleva il primo messaggio (non disabilitato) dalla coda (con rimozione)
queueExists: Verifica esistenza della coda
queueStatus: Restituisce lo stato della coda
getLastError: Restituisce l'ultimo errore avvenuto
updateLastMessageProcessed: Effettua l'aggiornamento della coda con l'esecuzione del messaggio appena eseguito.
findMessage: Ricerca i messaggi sulla coda
updateMessage: Aggiorna messaggio sulla cosa
Per reperire l'oggetto gestore, occorre fare in questo modo:
$qm = itaQueueFactory::getQueueManager();
Esempio di creazione di una coda:
$created = $qm->createQueue($itaQueueManagerBase::MESSAGE_TYPE_ANPR);
Worker
Ogni tipologia di coda ha una classe worker specifica, che si occupa dell'elaborazione del singolo messaggio.
Ad esempio, per ANPR, la classe specifica è 'itaQueueWorkerANPR' presente in 'lib/itaPHPQueue/workers/itaQueueWorkerANPR.class.php'.
Il worker è chiamato dal CLI, anch'esso specifico. Sempre nel caso di ANPR, lo script CLI da lanciare è 'queueWorkerANPR.php'.
Daemon
Per fare in modo che la coda giri come servizio, è opportuno scrivere un apposito daemon e registrarlo nel sistema come servizio.
Per creare un nuovo daemon, basta semplicemente creare una nuova classe in /daemon/daemons/ con la seguente nomenclatura:
<nome-daemon>Daemon.class.php.
I metodi da implementare sono:
executeStart: Metodo che viene invocato ad ogni iterazione.
executeStop: Metodo che viene invocato allo stop del servizio.
getSleepTime: Restituisce il numero di secondi di inattività tra un'iterazione e l'altra.
Per maggiori informazioni consultare la documentazione relativa ad itaDaemon9 visualizzazioni.