RoomServerAgent
La classe RoomServerAgent
riveste, per un RoomServer , lo stesso ruolo nella
comunicazione con un altro RoomServer di quello
che la classe ClientAgent fa per la comunicazione
con RoomClient e MainClient .
Un oggetto della classe RoomServerAgent
viene creato dal RoomServer ogni volta che un
nuovo RoomServer entra con successo nella rete;
in pratica, quindi, nella parte di commit del metodo addServer() .
Il costruttore è :
public RoomServerAgent(IRoomServerToServer roomServer, String remoteMainServerName, MainServer mainServer)
quindi alla creazione gli vengono indicati
il RoomServer remoto a cui mandare i messaggi,
il nome del MainServer remoto e un riferimento
al MainServer locale. Questi 2 ultimi parametri
sono necessari, per notificare localmente l’eventuale caduta
del server remoto a cui si fa riferimento.
Come ClientAgent , anche
RoomServerAgent implementa l’interfaccia IEventHandler ,
ed in particolare il metodo addEvent() . Il RoomServer
difatti si limiterà a consegnare l’evento al RoomServerAgent
che, con un thread separato, provvederà a comunicarlo al
RoomServer remoto.
La classe che si occupa di questo è
class RoomServerAgentEventHandler extends EventHandler
I dettagli implementativi di questo
aspetto sono del tutto analoghi a quelli descritti per la
classe ClientAgent .
Vi sono poi metodi che non sono trattati
attraverso eventi, ma vengono invocati direttamente dal RoomServer .
Essi sono :
public RoomState getRoomState(); per ottenere
lo stato della stanza
public IGameClient getGameClient(String user);
per ottenere il GameClient per l'utente locale
il cui nick è passato come argomento
Compito del RoomServerAgent ,
come si diceva, è anche quello di rilevare le eventuali cadute
di un RoomServer remoto. Se viene rilevata una
situazione di questo tipo (analogamente a ciò che fa il ClientAgent ,
intercettando una RemoteException durante l’invocazione
di un metodo remoto), il RoomServerAgent chiama
mainServer.serverDisconnected(remoteMainServerName);
Si fa l’ipotesi che se un RoomServer
su un nodo cade, tutti I RoomServer e il MainServer
della stessa ‘cellula’ siano caduti. A questo punto sarà il
MainServer ad occuparsi della disconnessione
del server nella sua complessità (MainServer ,
RoomServer e clienti connessi), comunicando la
scoperta agli altri server della rete.
Non c’è qui problema della sincronizzazione
che si aveva nel ClientAgent perché il RoomServerAgent
viene utilizzato solo unidirezionalmente, cioè dal RoomServer
locale per comunicare con quello remoto e non viceversa. Inoltre
la sequenzializzazione delle chiamate è garantita dal RoomServerEventHandler
|