Newsgroup: it.comp.java
Titolo: garbage collector troppo tempestivo..

ecco cosa succede:
c'è un'applicazione lanciata da remoto medante una servlet: tutto bene.
quando però provo a passare dei dati mediante un'altra servlet scopro 
che in memoria non c'è più nulla in quanto il garbage colector ha già 
fatto piazza pulita dopo la chiusura della servlet di avvio.
mi domando allora: come impedire al garbage collector di agire? cioè, 
come faccio a dirgli che alcune classi non devono essere buttate via?
oppure, è possibile in java creare un "orfanello" in modo da svincolarlo 
in qualche modo dal ciclo di vita della servlet di partenza?
grazie mille,
  padreTony

Ciao, padreTony!
Il giorno 05/05/2004 alle ore 12:46 hai scritto:
 p> che in memoria non c'è più nulla in quanto il garbage colector ha già
 p> fatto piazza pulita dopo la chiusura della servlet di avvio.
Come fai a passare i dati se non hai piu' un reference alla classe ? E se
hai un reference alla classe e' impossibile che il gc la spazzi via. Al 99%
hai intepretato male il ciclo di vita delle classi interessate.
 p> mi domando allora: come impedire al garbage collector di agire? cioè,
 p> come faccio a dirgli che alcune classi non devono essere buttate via?
Basta tenere un reference della classe da qualche parte.
 p> oppure, è possibile in java creare un "orfanello" in modo da svincolarlo
 p> in qualche modo dal ciclo di vita della servlet di partenza?
Anche se ci fosse il modo, come fai a reperire l'oggetto dalla memoria se
non hai piu' nessuna variabile che punta a quell'oggetto ?
Bye
-- 
Marco Maccaferri
MaccaSoft - 
http://www.maccasoft.com

 hai intepretato male il ciclo di vita delle classi interessate.
Al di là che sono d'accordo con Marco, la via più facile per creare quello
che vuoi è quello di utilizzare una classe di appoggio con variabili
private statiche ed accessi set/get sincronizzati.
Ciao D.
Inviato da 
www.mynewsgate.net

 come faccio a dirgli che alcune classi non devono essere buttate via?
Non centra nulla il gc.
Se ti crei un oggetto senza specificare nulla, il tuo oggetto ha implicito
scope=page. Quindi vive all'interno della pagina.
Devi utilizzare un bean con scope=session/request/application.
In alternativa ti puoi salvare un attributo nella
session/request/application.
Chiaramente se utilizzi la request, la devi passare anche all'altra servlet.
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


L'utente interagisce attraverso delle servlets che si scambiano msg. 
L'applicazione rivece i msg grazie ad una servlet parente della prima, 
quella che inizializza tutto, che "rimane in ascolto" di msg, e li 
smista alle classi dell'applicazione. In questo modo però non ho in 
realtà un reference fisso - non saprei dove metterlo, nel senso, a chi 
lo affido? dovrei usare una jvm oltre tomcat e lanciare un main da 
qualche parte? :( - perchè tutte le volte la servlet smista-msg viene 
creata, usata, e distrutta, così la prima e così tutto il resto mi sa..
Tutta l'applicazione sono qualche servlets e delle classi d'appoggio, è 
sufficiente allora dichiararle static per impedirne la distruzione alla 
terminazione della servlet?
grazie mille ancora,
  padreTony

 
non č troppo chiaro, potresti spiegarti meglio o riferirmi a della 
documentazione a riguardo per piacere?
Ho preso in considerazione anche l'idea di usare dei beans ma 
probabilmente non ho le idee molto chiare a riguardo e non so se 
potrebbe essere la soluzione piů facile.
grazie mille,
  pdreTony

Ciao, padreTony!
Il giorno 05/05/2004 alle ore 18:37 hai scritto:
 p> L'utente interagisce attraverso delle servlets che si scambiano msg.
Si scambiano msg come ?
 p> L'applicazione rivece i msg grazie ad una servlet parente della prima,
 p> quella che inizializza tutto, che "rimane in ascolto" di msg, e li
 p> smista alle classi dell'applicazione.
Rimane in ascolto come ?
 p> In questo modo però non ho in realtà un reference fisso - non saprei
 p> dove metterlo, nel senso, a chi lo affido?
Come non hai un reference fisso ? Come fai a comunicare con le altre classi
? La classe la istanzierai in qualche modo no ? Il reference lo puoi mettere
nel servletcontext come attributo.
 p> dovrei usare una jvm oltre
 p> tomcat e lanciare un main da qualche parte? :( - perchè tutte le volte
 p> la servlet smista-msg viene creata, usata, e distrutta, così la prima e
 p> così tutto il resto mi sa..
Cerca di fare un esempio di come funziona, non importa postare tutto il
codice. Finche' non chiarisci quello che stai facendo e cosa esattamente non
funziona non si puo' fare piu' di qualche vaga ipotesi.
Comunque fossi in te mi studierei meglio il ciclo di vita delle classi, dei
servlet, dei bean, ecc. ecc. insomma qualche base in piu'.


Come non detto, ho scoperto che il problema è da un'altra parte ma è 
ancora più oscuro.. :(
L'intoppo è nell'invio dei msg: una servlet richiama la doPost() di 
un'altra, si connette ma non trasmette quello che dovrebbe e risulta un 
errore di tipo 500 del protocollo http. Sono andato a vedere cosa 
significa ma è una specie di errore generico tipo semplicemente 
"qualcosa è andato storto e mi sono dovuto bloccare". Sospetto di 
passare una stringa troppo lunga..
Esiste un limite sulla lunghezza dei parametri? Sicuramente si, ma è 
inferiore a quello di una normale stringa java?
  padreTony

 un'altra, si connette ma non trasmette quello che dovrebbe e risulta un
Come fai la chiamata al metodo DoPost scusa?
Io credo che tu stai facendo confusione sul ciclo di vita dei Servlet e sul
loro utilizzo in genere.
Perchè mai un servlet dovrebbe chiamarne un altro per rimane "in ascolto"?
Se un servlet chiama un secondo è perchè delega a lui il controllo
dell'applicazione e di eventuali dispatcher. Tu chiami la doPost per fare
cosa?
Non conosco la tua appl. ma sono sicuro che puoi chiamare tranquillamente
un'altra classe.

 
Forse ora sono un pò più chiare le mie intenzioni.
Per ogni comunicazione i dati sono tanti e li devo spezzare in blochi. 
Una volta frammentati devo inviarli uno alla volta controllando la 
sequenzialità o alla fine tutto sarà incasinato. Dall'altra parte invece 
una servlet accoglie questi dati mediante il parametro request della 
doPost e li conserva da qualche parte.
Quello che succede per ora è che i vari "pachetti" vengono spediti ma 
non vengono ricevuti dalla servlet. Cioè, per ogni "pacchetto" tento la 
connessione e trasmetto. Talvolta invece la connessione viene rifiutata, 
allora attendo un pochetto e riprovo, finchè non ho trasmesso.
Quando guardo il log prodotto vedo cha la classe ha inviato tutti i 
"pacchetti" (pare) correttamente mentre la servlet non ha reagito.
Cosa può essere?
  padreTony