• Non ci sono risultati.

Recupero degli oggetti passivi

E' importante notare che gli oggetti passivi vengono recuperati inizialmente quando si entra in una regione; ogni peer continua però a ricevere attivamente oggetti passivi durante tutta la permanenza in una regione perchè gli oggetti possono essere creati dinamicamente e modicati. A questo scopo si attiva un thread che provvede a una ricerca continua degli oggetti.

4.6.1 Area di interesse statica

Nel paragrafo 3.3.4 è stata descritta la tecnica di recupero degli oggetti passivi nell'area di interesse statica del peer. L'implementazione è rappresentata dal thread DiscoveryObjects che implementa l'interfaccia net.jxta.discovery.DiscoveryListener. Il thread DiscoveryObjects viene attivato a seguito della connessione a una regio- ne. Ad intervalli di t millisecondi (il valore di t stabilisce la frequenza con cui i peer recuperano oggetti passivi; ad esempio, t=3000 millisecondi) si invia una richiesta di scoperta di advertisement di tipo ObjectAdv con il metodo getRemoteAdvertise- ment(); il metodo viene invocato passando come parametro un listener per gli eventi di tipo net.jxta.discovery.DiscoveryEvent. Tutti i peer della regione riceveranno que- sta richiesta di scoperta oggetti passivi; quelli che hanno pubblicato oggetti passivi

4.6. RECUPERO DEGLI OGGETTI PASSIVI 111 risponderanno al peer richiedente inviando una DiscoveryResponseMsg contenente l'advertisement dell'oggetto. Ad ogni ricezione di un evento DiscoveryEvent il peer inserisce l'ObjectAdv in una struttura dati gestita da esso stesso al ne di rendere più veloce l'accesso agli advertisement già scoperti.

4.6.2 Filtro sulle zone di interesse

Questa sezione descrive l'implementazione del recupero degli oggetti passivi secondo la soluzione illustrata nella sezione 3.3.4.

Ricordiamo che in ogni regione è possibile individuare diverse zone: sud, nord, etc; dunque possiamo associare ad ogni oggetto passivo, oltre alle coordinate (x, y, z) dello spazio, anche la zona dove esso si trova. A questo proposito notiamo che la classe ObjectAdv, che implementa l'advertisement per gli oggetti passivi, oltre al nome dell'oggetto, la descrizione, id unico, etc., include una variabile istanza che indica la zona della regione dove è stato creato l'oggetto (v. Esempio 5.1).

Il Discovery Protocol di JXTA permette di eseguire ricerche di risorse imponen- do dei ltri sul valore di qualche attributo dell'advertisement. Utilizzando questa caratteristica del protocollo possiamo denire con precisione le zone della regione in cui cercare gli oggetti passivi. Ricordiamo che per la regione principale la ricerca degli oggetti viene eseguita su tutta la regione; il ltro si applica solo alle regioni di conne.

Descriviamo l'esempio mostrato in gura 4.6: il peer P2 è posizionato nella zona Sud della regione R1. P2 esegue la connessione alla regione di conne R4; la proce- dura di join viene modicata introducendo un nuovo parametro che indica la zona da prendere in esame per la ricerca degli oggetti passivi. In questo esempio la zona di ricerca è la zona Nord (nord-est, nord, nord-ovest) della regione R4.

Dunque il thread per la scoperta degli oggetti passivi per la regione di con- ne R4 eseguirà il seguente codice: discovery. getRemoteAdvertisements (null, DiscoveryService.ADV, ObjectAdv.zoneKey, Nord, 10).

S N W E SW SE NW NE C S N W E SW SE NW NE C S N W E SW SE NW NE C S N W E SW SE NW NE C R1 R2 R4 R3

Figura 4.6: Il peer P2 si trova nella zona Sud della regione R1.

ˆ null: la richiesta viene inviata al rendezvous peer e propagata alla sottorete locale del peer attraverso IP multicast.

ˆ DiscoveryService.ADV: indica il tipo di discovery, in questo caso siamo inte- ressati agli advertisement; si utilizza la variabile statica dell'interfaccia net.jxta. discovery. DiscoveryService.

ˆ ObjectAdv.zoneKey: stringa che rappresenta il nome di uno dei campi in- dicizzati dal servizio SRDI; il campo zoneKey della classe ObjectAdv viene indicizzato (v. sopra denizione della classe ObjectAdv).

ˆ Nord: stringa con il cui valore viene eseguito il matching per il recuperare esclusivamente gli advertisement che hanno questo valore per l'attributo zone. .

L'esecuzione di questo codice permette di recuperare solo gli oggetti passivi della zona Nord della regione R4. Successivamente, se il peer P2 varca eettivamente il conne e si sposta nella regione R4 allora inzierà una ricerca di tutti gli oggetti presenti nella regione R4.

4.6. RECUPERO DEGLI OGGETTI PASSIVI 113

4.6.3 Area di interesse dinamica

In questo paragrafo descriviamo l'implementazione del recupero degli oggetti passivi con area di interesse dinamica, descritto nella sezione 3.3.4.

Innanzitutto notiamo che la tecnica descritta nel paragrafo precedente che utilizza il discovery service di JXTA, non può essere applicata in questo caso. Il metodo getRemoteAdvertisements(...) richiede di specicare una sola coppia (attributo, valore) su cui eseguire il matching di stringhe; dunque non è possibile indicare al Discovery Service ltri che deniscano intervalli di valori per un certo attributo dell'advertisement. Nel nostro caso sarebbe stato utile denire l'area di interesse mediante una disequazione che individui l'area a cui è interessato il peer.

L'implementazione fornita da JaDE utilizza il Resolver Protocol e Pipe Service. Descriviamo questa soluzione nello stesso scenario dell'esempio precedente di gura 4.6. Anche in questa soluzione, come per la precedente, il ltro si applica solo alle regioni conne.

Notiamo che ogni peer della regione di conne R4 dispone in cache di tutti gli oggetti contenuti nella regione.

Il peer P1 invia attraverso il Resolver Protocol una query ai peer della regione di conne R4 dove indica la propria area di interesse dinamica, denita come un disco di raggio ssato e centro dato dalla posizione del peer stesso. Il formato xml della query è mostrato di seguito:

ˆ Timestamp dell'invio della richiesta. ˆ Identicatore del peer.

ˆ Raggio Area.

ˆ Coordinata x centro. ˆ Coordinata y centro. .

Ricordiamo che l'ambito del Resolver Protocol è il peer group, dunque ogni peer della regione R4 riceverà il messaggio di richiesta oggetti da parte di P1. Ogni peer della regione R4 ricevendo la query, invia a sua volta un messaggio di risposta indicando il proprio peer id.

Il peer P1 riceve le risposte alla query e tra queste ne sceglie solo una, la prima che riceve; in questo modo sceglie un peer della regione R4 a cui richiedere gli oggetti passivi che fanno parte della propria area di interesse. Il peer prescelto seleziona gli oggetti passivi che soddisfano le condizioni imposte da P1 (ricordiamo che ogni oggetto passivo è caratterizzato dalle coordinate (x, y, z), posizione che occupa del mondo virtuale) e invia gli oggetti passivi che soddisfano l'area di interesse di P1 attraverso una JXTA Pipe.