Newsgroup: it.comp.java
Titolo: RMI e concorrenza...chi sbaglia?

ciao a tutti
mi sto interessando a RMI ed ho alcuni dubbi, che mi ha sollevato la
lettura di un libro.
Ho creato una classe di prova , che fa soltanto una stampa e seguendo
le indicazioni del libro l'ho modificata e ho fatto tutti i passi
necessari in modo che possa essere eseguita in remoto.
In pratica la classe estende UnicastRemoteObject, creo stub e
skeleton, ecc...
Tutto funziona, chiamando da remoto questa classe fa la sua stampa sul
client...ma alla fine di tutta la spiegazione il libro fa notare che
di questa classe remota č presente UNA UNICA ISTANZA CHE VERRA'
CONDIVISA TRA TUTTI I CLIENT...
cioe' non c'e' multithreading, ogni client deve attendere che la
classe remota venga rilasciata da qualche altro client per 
poterla eseguire!
Inoltre il libro indica un modo per superare questa limitazione, il
pattern Factory...o in alternativa, da Java2, 
la classe remota deve estendere Activatable e seguire certe altre
regole.
A me questa cosa non andava giů ed ho fatto delle prove, per vedere se
effettivamente il mio modo di fare RMI non supporta 
il multithreading. 
Cosicche ho modificato la classe remota, che ora fa una stampa sul
client, ed attende 20 secondi prima di terminare...
quindi se 2 client usassero UNO ALLA VOLTA la classe remota avremmo 2
stampe intervallate di 20 secondi l'una dall'altra.
Invece succede il contrario, cioe facendo chiamare la classe remota
CONTEMPORANEAMENTE da 2 client, ottengo 2 stampe
quasi istantanee...ciň significa che i 2 client usano ognuno una
istanza diversa della classe remota!
Altrimenti non potrebbero stampare insieme!
Ecco il mio dubbio č questo...cosa devo fare per poter far chiamare la
classe remota e fare in modo che ogni client 
ne abbia una propria istanza? Seguire le indicazioni del libro oppure
fidarmi della mia prova?
Grazie mille per la risposta!!!
____________________________________________________________________________________
email : 
filip...@libero.it


Se tu vuoi che ciascuno abbia una propria istanza (e quindi attributi separati) ti
consiglio l'approccio basato sulla factory. Se hai bisogno di ulteriori informazioni posta
sul NG.
Ciao,
    Bruno.
---
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://members.xoom.it/bbruno
| 
http://digilander.iol.it/bbossola

grazie per le vostre risposte
ho capito alcuni dei dubbi che avevo...
quindi tutti i client hanno una unica istanza che pero eseguono
contemporaneamente
il problema e' se ,ad esempio,si usano attirbuti condivisi ,  in quel
caso vanno sincronizzati
nel mio caso, i metodi remoti che possono essere chiamati
contemporaneamente da 2 client diversi, fanno delgli inserimenti in un
database MySql...ora dato che MySql gestisce il multithread anche
facendo delle prove ho notato che non ci sono problemi ...quindi posso
anche non sincronizzare tali metodi.
Mi spiego meglio
ho il client A  e il client B
entrambi eseguono il metodo remoto PROVA ( cioe eseguono la stessa
istanza di tale metodo) che al suo interno esegue un inserimento nel
db...ad esempio per il client A avro' INSERT INTO DB VALUES ("PIPPO")
mentre per il client B avro' INSERT INTO DB VALUES("PLUTO").
Se anche i 2 metodi remoti fossero eseguiti contemporaneamente, ci
sarebbe un acccesso multithreading al db di MySql, che gestisce la
concorrenza e quindi nonho problemi...giusto?
grazie dell'ulteriore risposta ;)
On Mon, 21 Jan 2002 08:11:47 GMT, 
bbos...@hotmail.com
 (Bruno Bossola)
wrote:

____________________________________________________________________________________
email : 
filip...@libero.it


Si, se MySql funziona :-)


>ho il client A  e il client B

____________________________________________________________________________________
email : 
filip...@libero.it

>ho il client A  e il client B

____________________________________________________________________________________
email : 
filip...@libero.it


Si. Ogni thread (in pratica) avra' una "propria copia" delle variabili locali del metodo.
(qui comunque RMI c'entra solo lateralmente, e' una questione di multi threading)


 >
[CUT]
Io Bruno avrei invece un piccolo dubbio a tal proposito ...credo ti sia
sfuggito il fatto che l'oggetto Statement non viene definito all'interno del
metodo ... IMHO in questo caso l'oggetto Statement č definito a livello
globale ... quindi in questo caso alla seconda chiamata il primo ResultSet
DOVREBBE essere chiuso e quindi non piů disponibile ......in sintesi una
cosa fatta cosě non dovrebbe funzionare ..
ma dovrebbe essere :
metodo remoto()
{
Statement stmt = miaConnessione.createStatement();
ResultSet rs=stm.executeQuery(query...)
while (rs.next())
 fai la insert nel db
}
Ovviamente mancano i blocchi try, catch e la chiusura dello Statement ...ma
č solo per rendere l'idea
ciao ciao
Dani
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If at first the idea is not absurd then there is no hope for it. - Albert
Einstein
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


____________________________________________________________________________________
email : 
filip...@libero.it

Sě certo avevo capito Filo che era una omissione e sicuramente anche il
mitico Bruno non l'aveva visto altrimenti te lo avrebbe subito segnalato
....lui č un guru :-)
era solo una piccola precisazione ...



Anche io volevo solo rendere l'idea :-)
Comunque facciamo pure le cose bene, mettiamo i puntini sulle i, anche perche' e'
piuttosto importante chiudere esplicitamente resultset, statement e connessioni, senza
affidarsi ciecamente al garbage collector.


Grande Bruno ... vedi che ho ragione quando dico che sei un Guru!
Ciao



Tranquillo, hai fatto bene a puntualizzare. Sono io che ho poco tempo, purtroppo :-(, e a
volte faccio veramente il minimo possibile.


>Io Bruno avrei invece un piccolo dubbio a tal proposito ...credo ti sia

____________________________________________________________________________________
email : 
filip...@libero.it

boh io non mi sarei capito...tu hai capito? ;))
Mah? Speriamo abbia capito anche qualcun altro :-D, io per un paio di giorni saro'
offline.
