2011-02-04 13 views
8

Ho un problema per aggiornare o ricaricare un bean gestito con scope dell'applicazione. Si comporta come un bean di dati memorizzato nella cache. Quindi una volta che i dati sono cambiati sul lato db, voglio ricaricare la lista nel bean. Esiste comunque un modo per aggiornare/ricaricare l'elenco, ad esempio una volta al giorno in base all'ora prestabilita? GrazieAggiorna/Ricarica bean gestito dell'ambito applicazione

risposta

14

Basta aggiungere un metodo al bean con scope di aplicazione che fa esattamente questo.

public void reload() { 
    list = dao.list(); 
} 

Quindi afferrare/iniettare questo bean in un altro bean e chiamare il metodo.

data.reload(); 

aggiornamento dispiace, ho trascurato il "una volta al giorno" bit. Intendi ricaricare automaticamente in background? Questo è il modo migliore per ottenere un thread in background gestito da ScheduledExecutorService. Creare un ServletContextListener piace segue:

@WebListener 
public class Config implements ServletContextListener { 

    private ScheduledExecutorService scheduler; 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     Reloader reloader = new Reloader(event.getServletContext()); 
     scheduler = Executors.newSingleThreadScheduledExecutor(); 
     scheduler.scheduleAtFixedRate(reloader, 1, 1, TimeUnit.DAYS); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     scheduler.shutdownNow(); 
    } 

} 

dove lo sguardo di classe Reloader come questo (assumendo che il nome bean gestito è data)

public class Reloader implements Runnable { 

    private ServletContext context; 

    public Reloader(ServletContext context) { 
     this.context = context; 
    } 

    @Override 
    public void run() { 
     Data data = (Data) context.getAttribute("data"); 
     if (data != null) { 
      data.reload(); 
     } 
    } 

} 
+0

Grazie @BalusC molto – leo

+1

Sei il benvenuto. Devi comunque essere estremamente attento con la gestione dei thread in un contenitore servlet. Il 'scheduler.shutdownNow();' bit in 'contextDestroyed()' è molto importante. Potresti considerare di delegare il lavoro di gestione dei thread al servlet container, se lo supporta. JBoss ha per esempio il quarzo per questo, Glassfish ha per esempio 'WorkManager' per questo. In Tomcat, l'esempio sopra è la soluzione migliore. – BalusC

+0

@BalusC Ho lo stesso bisogno. L'ho implementato nella mia applicazione. L'unico problema è che nel metodo 'Reloader'' run() 'il mio bean è sempre nullo. Puoi darmi un suggerimento, per favore – leostiw

Problemi correlati