• Non ci sono risultati.

regione attraverso Internet

3.5 L’add-on Persistence

JADE dispone di un add-on chiamato Persistence liberamente ottenibile dal sito ufficiale.

Questo add-on offre un sistema di memorizzazione persistente degli agenti e dei container e garantisce piena compatibilità con diversi sistemi DBMS relazionali8.

3.5.1 La libreria Hibernate

Viene utilizzata principalmente la libreria Hibernate9 che si occupa di garantire la portabilità tra i sistemi DBMS, gestire i problemi di efficienza, definire un formato basato su XML per la persistenza delle strutture dati (e la relativa mappatura nelle tabelle del database) e fornire un’ApplicationProgrammigInterface (API).

Hibernate, quindi, permette di definire, memorizzare in modo persistente e gestire qualsiasi struttura dati che può essere definita in Java con il minimo impatto sul codice sorgente.

3.5.2 La struttura

Grazie alle funzionalità di Hibernate, l’add-on Persistence consente agli sviluppatori di salvare (e ripristinare) non solo lo stato dei container e degli agenti JADE - comprese le code dei messaggi -, ma anche eventuali classi

8 Purtroppo quello utilizzato dal prototipo attuale - SQLite (http://www.sqlite.org/) - non è supportato. In alternativa, come consigliato dagli stessi creatori di JADE, è possibile utilizzare HyperSQL Database (http://hsqldb.sourceforge.net), una implementazione open-source basata unicamente su java di un DBMS relazionale che può funzionare semplicemente come libreria o come server stand-alone.

specifiche (la mappatura tra classi e dabatase viene stabilita da un file XML).

Gli agenti ed i container vengono salvati all’interno di uno o più repository10 che possono essere dislocati in un punto qualsiasi della piattaforma JADE (questa caratteristica, come si analizzerà più avanti, si rivela molto utile per il raggiungimento degli scopi del sistema da realizzare).

Le descrizioni dei repository disponibili sono mantenute in un repository particolare chiamato meta-repository che viene creato automaticamente da Persistence; se non viene definito alcun repository, ne viene creato sempre automaticamente uno chiamato JADE-DB adatto alla memorizzazione di agenti e container.

In Figura 3-6 è possibile osservare una configurazione tipica di Persistence in cui i componenti presenti sui vari container della piattaforma puntano allo stesso meta-repository (ed allo stesso file di configurazione per Hibernate) ed è presente solo il repository di default JADE-DB per la memorizzazione degli agenti.

Figura 3-6 - add-on Persistence: dislocazione dei repository.

10 Un repository è un insieme di tabelle all’interno di un database. Persistence Service Persistence Service Persistence Service Hibernate property file Meta repository JADE-DB

Main Container Container 2 Container 1 Hold information about available repositories Hold persisted agents, containers

3.5.3 Le primitive

Le primitive messe a disposizione da Persistence sono le seguenti: - Save-Agent: salva un’istantanea dello stato dell’agente e delle

code dei messaggi all’interno di uno specifico repository appena il controllo è restituito allo scheduler di JADE dal behaviour attualmente in esecuzione. Ovviamente l’agente deve essere serializzabile o comunque reso tale (deve implementare, quindi, l’interfaccia java.io.Serializable).

- Load-Agent: crea un nuovo agente, leggendo lo stato iniziale dal repository.

- Reload-Agent: resetta lo stato attuale dell’agente caricando quello memorizzato all’interno del repository.

- Delete-Agent: rimuove dal repository lo stato dell’agente salvato in precedenza.

- Freeze-Agent: salva un’istantanea dello stato dell’agente e ne interrompe l’esecuzione senza eliminarlo. Viene attivato un meccanismo che raccoglie su un dato container i messaggi destinati all’agente mentre si trova nello stato frozen (il container può essere diverso da quello in cui si trovava l’agente ibernato); l’agente apparirà come se fosse in esecuzione su questo

container ed i messaggi ricevuti verranno memorizzati all’interno del repository.

- Thaw-Agent: ripristina il normale funzionamento di un agente precedentemente congelato, leggendo il suo stato dal repository ed inoltrandogli tutti i messaggi ricevuti durante il periodo in cui era congelato.

- Save-Container: salva lo stato del container all’interno del repository compresi nome ed indirizzi MTP del container e tutti gli agenti in esso contenuti.

- Load-Container: carica un intero container dal repository: prima vengono interrotti tutti gli agenti attualemnte in esecuzione e vengono disabilitati tutti gli endpoint MTP; poi viene ripristinato tutto dal repository.

- Delete-Container: elimina il salvataggio del container dal repository.

Esecuzione delle primitive

E’ possibile eseguire le primitive appena elencate in tre modi:

1. tramite le API fornite dall’add-on Persistence: un’interfaccia PersistenceHelper11 fornisce agli agenti il modo di eseguire le primitive di tipo save, reload o freeze;

2. inoltrando una richiesta all’agente AMS della regione affinchè esegua una Action (jade.content.onto.basic.Action) secondo l’ontologia specifica di Persistence (definita nel package jade.domain.persistence);

3. attraverso l’interfaccia grafica fornita da Persistence.

3.5.4 Considerazioni

Le primitive offerte da questo add-on di JADE si rivelano molto utili per gli scopi del sistema che si andrà a realizzare. In particolare Save-Agent e Load-Agent assumono una rilevanza notevole in quanto gestiscono anche le code dei messaggi di ogni agente.

Le primitive Freeze-Agent e Thaw-Agent sono potenzialmente complete ma vanno oltre le specifiche necessità del nuovo sistema: utilizzarle per implementare le primitive suspendP e resumeP (paragrafo 3.3.2) si rivelerebbe eccessivo, in quanto per la sospensione di un peer è sufficiente sospendere le attività degli agenti, in modo che i messaggi in arrivo vengano comunque recapitati ma non processati.

Utilizzare Freeze-Agent e Thaw-Agent dell’add-on Persistence per realizzare le primitive freezeP e thawP potrebbe essere una soluzione; ciò, tuttavia, siccome l’ibernazione (freezeP) di un peer comporta il congelamento (Freeze-Agent) di tutti i suoi agenti, potrebbe rappresentare un problema: infatti sarebbe necessario congelare (Freeze-Agent) molti agenti per l’ibernazione (freezeP) di un solo peer e il numero aumenterebbe molto se la richiesta fosse di ibernare più agenti, sovraccaricando in questo modo i container che andranno ad ospitare la versione congelata dei vari agenti, memorizzando all’interno del database i messaggi in arrivo.

Le primitive Save-Container e Load-Container rivelano una sostanziale efficacia ma memorizzano senza distinzione tutti gli agenti presenti in un dato momento all’interno del container (anche eventuali agenti migrati

11 Un oggetto di tipo PersistenceHelper può essere ottenuto tramite un metodo della classe Agent con parametro PersistenceService.NAME.

temporaneamente) e lasciano poco margine per la gestione delle dipendenze fra gli agenti: ad esempio l’agente RSMA (che gestisce lo stato delle risorse) per poter interrompersi in seguito ad una primitiva stopP deve prim attendere che tutti gli agenti che lo contattano per aggiornare lo stato di una risorsa abbiano completato l’esecuzione della stessa primitiva stopP.

Il salvataggio individuale di ogni agente assicura un maggior controllo sia del momento in cui può avvenire, sia delle specifiche necessità di ogni agente.

3.6 Primitive di amministrazione: ipotesi di