|
||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object | +--java.lang.Thread | +--CallMsgManager
Thread che si occupa della gestione delle connessioni con i FE rispondendo ai cosiddetti call messages. Gestisce il protocollo di comunicazione con il FE e si occupa di eseguire le operazioni richieste.
CallMsgServer
Field Summary | |
private static boolean |
DEBUG
Flag per abilitare stampe di debugging su standard output e standard error. |
private boolean |
GOSSIP_BY_NEED
Flag che indica che il CallMsgManager deve effettuare gossip by need. |
private int |
GOSSIP_SLEEP
Rappresenta il numero di millisecondi che un thread CallMsgManager attende (se il flag GOSSIP_BY_NEED e' settato a false) prima
di ritestare se puo' eseguire una query la cui esecuzione deve essere
ritardata fino a che lo stato del RM non e' aggiornato tanto quanto
quello del FE che l'ha richiesta.
|
private java.io.ObjectInputStream |
in
Per la lettura dei dati inviati dai FE e' usato un oggetto java.io.ObjectInputStream poiche' implementa l'interfaccia java.io.DataInput usabile anche per i tipi primitivi di java. |
private java.io.ObjectOutputStream |
out
Per l'invio delle risposte ai FE e' usato un oggetto java.io.ObjectOutputStream poiche' implementa l'interfaccia java.io.DataOutput usabile anche per i tipi primitivi di java. |
private java.net.Socket |
socket
Socket per la connessione con il FE. |
private StatoRM |
statoRM
Riferimento alle variabili che rappresentano lo stato del Replica Manager di cui si deve gestire il call message. |
Fields inherited from class java.lang.Thread |
contextClassLoader,
daemon,
eetop,
group,
inheritedAccessControlContext,
MAX_PRIORITY,
MIN_PRIORITY,
name,
NORM_PRIORITY,
priority,
single_step,
stillborn,
stopThreadPermission,
target,
threadInitNumber,
threadQ,
values |
Constructor Summary | |
CallMsgManager(java.net.Socket socket,
StatoRM stato)
Crea un'istanza di CallMsgManager data la socket di connessione con il FE e un riferimento allo stato del RM. |
|
CallMsgManager(java.net.Socket socket,
StatoRM stato,
java.lang.String name)
Crea un'istanza di CallMsgManager data la socket di connessione con il FE, un riferimento allo stato del RM e una stringa che rappresenta il nome del thread. |
Method Summary | |
boolean |
getGossipByNeed()
Restituisce il valore del flag GOSSIP_BY_NEED : se true indica che il
CallMsgManager effettua gossip by need. |
int |
getGossipSleep()
Restituisce il numero di millisecondi che un thread CallMsgManager attende (se il flag GOSSIP_BY_NEED e' settato a false)
prima di ritestare se puo' eseguire una query la cui esecuzione deve
essere ritardata fino a che lo stato del RM non e' aggiornato tanto
quanto quello del FE che l'ha richiesta. |
private void |
println(java.lang.String str)
Stampa nella finestra di output Output il nome dello thread corrente seguito dalla stringa passata come argomento e va a capo.
|
private void |
processAck()
Esegue il comando ACK. |
private void |
processGet(MultipartTimestamp prev)
Esegue il comando GET. |
private void |
processList(MultipartTimestamp prev)
Esegue il comando LIST. |
private void |
processLookup()
Esegue il comando LOOKUP. |
private void |
processNum()
Esegue il comando NUM. |
private void |
processPut(MultipartTimestamp prev)
Esegue il comando PUT. |
void |
run()
Ridefinisce l'omonimo metodo della superclasse java.lang.Thread implementando il protocollo di comunicazione con il FE ed effettuando le operazioni che gli vengono richieste. |
void |
setGossipByNeed(boolean flag)
Setta il flag GOSSIP_BY_NEED : se settato a true indica che il
CallMsgManager deve effettuare gossip by need.
|
void |
setGossipSleep(int millis)
Setta il numero di millisecondi che un thread CallMsgManager attende (se il flag GOSSIP_BY_NEED e' settato a false) prima di
ritestare se puo' eseguire una query la cui esecuzione deve essere
ritardata fino a che lo stato del RM non e' aggiornato tanto quanto
quello del FE che l'ha richiesta. |
private void |
testQuery(MultipartTimestamp prev)
Verifica se puo' eseguire la query : se lo stato del RM non e' aggiornato tanto quanto quello del FE la query non puo' essere eseguita. |
Methods inherited from class java.lang.Thread |
|
Methods inherited from class java.lang.Object |
clone,
equals,
finalize,
getClass,
hashCode,
notify,
notifyAll,
wait,
wait,
wait |
Field Detail |
private StatoRM statoRM
private java.net.Socket socket
private java.io.ObjectOutputStream out
private java.io.ObjectInputStream in
private boolean GOSSIP_BY_NEED
GOSSIP_SLEEP
millisecondi in attesa che altri thread aggiornino lo stato del RM.
Terminata l'attesa riverifica se puo' eseguire la query, in caso
contrario ripete il procedimento di attesa e test.
Il valore di default e' true.GOSSIP_SLEEP
,
setGossipByNeed(boolean)
,
getGossipByNeed()
private int GOSSIP_SLEEP
GOSSIP_BY_NEED
e' settato a false) prima
di ritestare se puo' eseguire una query la cui esecuzione deve essere
ritardata fino a che lo stato del RM non e' aggiornato tanto quanto
quello del FE che l'ha richiesta.
Il valore di default e' 1000 millisecondi.GOSSIP_BY_NEED
,
setGossipSleep(int)
,
getGossipSleep()
private static final boolean DEBUG
Constructor Detail |
public CallMsgManager(java.net.Socket socket, StatoRM stato)
socket
- socket di connessione con il FE.stato
- riferimento allo stato del RM.public CallMsgManager(java.net.Socket socket, StatoRM stato, java.lang.String name)
socket
- socket di connessione con il FE.stato
- riferimento allo stato del RM.name
- nome da assegnare al thread.Method Detail |
public void setGossipByNeed(boolean flag)
GOSSIP_BY_NEED
: se settato a true indica che il
CallMsgManager deve effettuare gossip by need.
Nel caso una query non possa essere eseguita perche' lo stato del FE
e' piu' aggiornato di quello del RM, il thread CallMsgManager
richiede esplicitamente un aggiornamento agli altri RM mediante il
protocollo di gossip.
Se settato a false, nel caso una query non possa essere eseguita
perche' lo stato del FE e' piu' aggiornato di quello del RM, il
thread CallMsgManager si sospende per GOSSIP_SLEEP
millisecondi in attesa che altri thread aggiornino lo stato del RM.
Terminata l'attesa riverifica se puo' eseguire la query, in caso
contrario ripete il procedimento di attesa e test.
Il valore di default del flag e' true.flag
- true per abilitare il gossip by need, false per
disabilitarlo.GOSSIP_BY_NEED
,
GOSSIP_SLEEP
,
getGossipByNeed()
public boolean getGossipByNeed()
GOSSIP_BY_NEED
: se true indica che il
CallMsgManager effettua gossip by need. Nel caso una query non possa
essere eseguita perche' lo stato del FE e' piu' aggiornato di quello
del RM, il thread CallMsgManager richiede esplicitamente un
aggiornamento agli altri RM mediante il protocollo di gossip.
Se false, nel caso una query non possa essere eseguita perche' lo
stato del FE e' piu' aggiornato di quello del RM, il thread
CallMsgManager si sospende per GOSSIP_SLEEP
millisecondi in
attesa che altri thread aggiornino lo stato del RM. Terminata
l'attesa riverifica se puo' eseguire la query, in caso contrario
ripete il procedimento di attesa e test.GOSSIP_BY_NEED
,
GOSSIP_SLEEP
,
setGossipByNeed(boolean)
public void setGossipSleep(int millis)
GOSSIP_BY_NEED
e' settato a false) prima di
ritestare se puo' eseguire una query la cui esecuzione deve essere
ritardata fino a che lo stato del RM non e' aggiornato tanto quanto
quello del FE che l'ha richiesta.millis
- numero di millisecondi di attesa.GOSSIP_BY_NEED
,
GOSSIP_SLEEP
,
getGossipSleep()
public int getGossipSleep()
GOSSIP_BY_NEED
e' settato a false)
prima di ritestare se puo' eseguire una query la cui esecuzione deve
essere ritardata fino a che lo stato del RM non e' aggiornato tanto
quanto quello del FE che l'ha richiesta.GOSSIP_BY_NEED
,
GOSSIP_SLEEP
,
setGossipSleep(int)
public void run()
FrontEnd
.private void testQuery(MultipartTimestamp prev)
GOSSIP_BY_NEED
e' settato a true, il thread
richiede esplicitamente un aggiornamento del suo stato da altri RM
mediante il protocollo gossip.
Se il flag GOSSIP_BY_NEED
e' settato a false, il thread si
sospende per GOSSIP_SLEEP
millisecondi, dopodiche' ripete
indefinitamente test ed eventuale sospensione.prev
- multipart timestamp del FE che ha richiesto il comando.GOSSIP_BY_NEED
,
GOSSIP_SLEEP
private void processList(MultipartTimestamp prev) throws java.lang.Exception
prev
- multipart timestamp del FE che ha richiesto il comando.private void processGet(MultipartTimestamp prev) throws java.lang.Exception
prev
- multipart timestamp del FE che ha richiesto il comando.private void processAck() throws java.lang.Exception
MultipartTimestamp
potrebbe
restituire una copia del multipart timestamp.
Tale metodo si potrebbe avvalere di un ulteriore metodo protected MultipartTimestamp clone2()della classe
MultipartTimestamp
per la copia. Si puo'
ridefinire il metodo clone() di java.lang.Object (non basta quello della
superclasse Object perche' fa copie shallow) con la differenza
che restituisce un java.lang.Object (necessita' di casting), lancia
l'eccezione java.lang.CloneNotSupportedException e la classe
MultipartTimestamp
deve implementare l'interfaccia java.lang.Cloneable.
public synchronized MultipartTimestamp clone2()alla classe
MultipartTimestamp
che restituisce un nuovo
oggetto MultipartTimestamp copia esatta di quello su cui e'
invocato il metodo. Vedi sopra per ridefinire clone() di java.lang.Object.
Questo metodo consente di copiare in modo thread-safe rep_ts.
In maniera asincrona, poi, si possono incrementa rep_ts e la
copia prima di includere quest'ultima nell'ack record.
MultipartTimestamp
per
far ritornare al metodo incElementAt(int) un nuovo oggetto.
La soluzione b) sembra piu' elegante e non obbliga la classe
MultipartTimestamp ad avere metodi "strani" dovuti all'uso che altre
classi vogliono fare della struttura dati che implementa. E' piu' vicina
all'idea di "meccanismo" sul quale basare varie "politiche".
L'approccio "ad hoc" della soluzione a) richiederebbe nuovi metodi per
nuove possibili esigenze di sincronizzazione. public synchronized MultipartTimestamp advanceTimestamp(int)alla classe
MultipartTimestamp
che incrementa l'elemento
specificato di uno e restituisce una copia del nuovo stato
del MultipartTimestamp, il tutto in maniera atomica. StatoRM
e' aggiunto un metodo public MultipartTimestamp advanceAndCloneLocalTimestamp()che invoca il precedente sulla variabile rep_ts.
StatoRM
resta tale e quale MultipartTimestamp
resta
tale e quale MultipartTimestamp
da usare al posto di clone() che comunque non
viene per ora eliminato MultipartTimestamp
alla classe StatoRM
prev
- multipart timestamp del FE che ha richiesto il comando.private void processPut(MultipartTimestamp prev) throws java.lang.Exception
processAck()
prev
- multipart timestamp del FE che ha richiesto il comando.processAck()
private void processNum() throws java.lang.Exception
private void processLookup() throws java.lang.Exception
private void println(java.lang.String str)
Output
il nome dello thread corrente seguito dalla stringa passata come argomento e va a capo.
Ha lo stesso effetto dell'invocazione Output.println(Thread.currentThread().getName()+" : "+str).str
- stringa da stampare nella finestra di output Output
.Output
,
Output.println(String)
|
||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |