Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    390

    Gestione sessione in ciclo for

    Salve a tutti.
    Ho una domanda breve e semplice da porre:

    ho una servlet che mi deve elaborare dei dati, e la cui elaborazione richiede molto tempo.
    Per ovviare al problema "aspetta all'infinito", ho inserito un controllo sulla percentuale di avanzamento.

    La gestione della percentuale ha la seguente logica:
    - invoco la servlet;
    - all'interno della servlet, setto il valore di un attributo di sessione ogni x iterazioni di elaborazione (all'interno del ciclo for di elaborazione);
    - in parallelo, un thread separato preleva il valore dell'attributo di sessione e lo mostra sul browser.

    Il problema si ha nel punto 2, ovvero il setAttribute è come se funzionasse soltanto a ciclo for completato, o quantomeno è come se non valorizzasse l'attributo durante il ciclo, ma la valorizzazione la fa soltanto a ciclo terminato, e con l'ultimo valore che avrebbe assunto l'attributo all'interno del ciclo (spero di essermi spiegato).

    Com'è possibile??

    Grazie 1000
    Date a Cesare quel che è di Cesare,
    tutto il resto a me!!

  2. #2
    Se il parallelo è una chiamata ajax, penso che il tuo problema sta nel fatto che durante il ciclo for l'oggetto sessione non viene restituito al browser e quindi la chiamata asincrona ajax porta con se una sessione non verosimile rispetto a quella che sta elaborando il ciclo.

    Potresti risolvere con una mappa statica dove puoi inserire la percentuale associandola all'id della sessione. L'inconveniente però è che la mappa rimane così instanziata per tutto il ciclo di vita del container e per questo va azzerata periodicamente con un altro thread.
    "Na' sedia te vojo tirà!"

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    390
    mm....in alternativa alla mappa cos'altro sarebbe consigliabile??
    Date a Cesare quel che è di Cesare,
    tutto il resto a me!!

  4. #4
    Non mi vengono in mente altre soluzioni al di fuori di quella di usare una variabile statica.
    Penso che l'associazione l'id sessione è una necessità, altrimenti altre richieste concorrenti andrebbero a leggere lo stesso valore di percentuale.

    Qual è il tuo problema nell'usare una mappa?
    "Na' sedia te vojo tirà!"

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    390
    Originariamente inviato da Brazonet
    Non mi vengono in mente altre soluzioni al di fuori di quella di usare una variabile statica.
    Penso che l'associazione l'id sessione è una necessità, altrimenti altre richieste concorrenti andrebbero a leggere lo stesso valore di percentuale.

    Qual è il tuo problema nell'usare una mappa?
    non mi andrebbe di avere una mappa praticamente sempre allocata

    ma se non ci sono altre soluzioni...amen...uso questa
    Date a Cesare quel che è di Cesare,
    tutto il resto a me!!

  6. #6
    Puoi provare a usare le WeakHashMap, sono mappe che vengono sfoltite in automatico dal garbage collector.
    Fai però diversi test sull'effettivo ciclo di vita delle informazioni durante la tua sessione, non vorrei che il gc te le elimini troppo presto durante il tuo processo di attesa.
    "Na' sedia te vojo tirà!"

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    390
    estavo provando con l'hashmap statica...solo che durante la chiamata ajax ricevo un bell NullPointer
    eppure, a livello temporale, produco prima di consumare, il nome dell'attributo è lo stesso, ma in fase di get, esplode tutto
    Date a Cesare quel che è di Cesare,
    tutto il resto a me!!

  8. #8
    Così è difficile capire il perché della tua nullpointer exception.
    Nella dichiarazione della variabile statica hai messo la new della mappa?

    Esempio:

    codice:
    private static Map<String, Integer> tuaMappa = new HashMap<String, Integer>();
    "Na' sedia te vojo tirà!"

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    390
    ecco quanto


    codice:
     
    public class MyServlet extends HttpServlet {
    
    	public static HashMap percentageMap = new HashMap();
    
    
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		
    		
    		String sessionId = req.getSession().getId();
    		percentageMap.put(sessionId, "0");
    		req.getSession().setAttribute("percentageMap", percentageMap);
    .....
    .....
    .....
    		Iterator iter = eventList.iterator();
    		while (iter.hasNext()) {
    			iteration++;
    
    .....
    
    				if(iteration%500==0)
    					percentageMap.put(sessionId, new Integer((int)(iteration/(double)eventList.size()*100)).toString());
    .....
    		}
    		percentageMap.put(sessionId, "100");
    .....

    alla prima esecuzione della servlet l'attributo non viene settato, dalla seconda invocazione in poi si
    Date a Cesare quel che è di Cesare,
    tutto il resto a me!!

  10. #10
    A prima vista mi sembra tutto corretto. Che intendi quando dici che alla prima esecuzione non viene settato? Che la percentuale non viene inserita nella mappa e/o nella sessione?
    "Na' sedia te vojo tirà!"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.