2011-02-04 7 views
8

Tengo un problema para actualizar o volver a cargar un bean administrado con ámbito de aplicación. Se comporta como un bean de datos en caché. Entonces, una vez que se cambian los datos en el lado db, quiero volver a cargar la lista en el bean. ¿Hay alguna forma de actualizar/volver a cargar la lista, por ejemplo, una vez al día en función del tiempo determinado? GraciasRefrescar/Recargar Alcance administrado de aplicación

Respuesta

14

Simplemente agregue un método al bean con ámbito de aplicación que hace exactamente eso.

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

Luego agarra/inyecte este frijol en otro bean y llamar al método.

data.reload(); 

actualización lo siento, me daba la "una vez al día" bits. ¿Te refieres a recarga automática en el fondo? Lo mejor es lograrlo con un hilo de fondo administrado por ScheduledExecutorService. Crear una ServletContextListener LIKE:

@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(); 
    } 

} 

Cuando la mirada de clase Reloader como esto (suponiendo que el nombre del bean administrado es 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

Gracias un montón @BalusC – leo

+1

de qué. Sin embargo, debe ser extremadamente cuidadoso con la administración de los hilos en un servletcontainer. El bit 'scheduler.shutdownNow();' en 'contextDestroyed()' es muy importante. Puede considerar delegar el trabajo de gestión de subprocesos al servletcontainer, si es compatible. JBoss tiene, por ejemplo, Quartz para esto, Glassfish tiene por ejemplo 'WorkManager' para esto. En Tomcat, el ejemplo anterior es tu mejor apuesta. – BalusC

+0

@BalusC Tengo la misma necesidad. Implementé esto en mi aplicación. El único problema es que en el método 'Reloader' 'run()' my bean siempre es nulo. ¿Puedes darme una pista por favor? – leostiw

Cuestiones relacionadas