¿Es posible hacer referencia a Facescontext desde TimeTask o ProgramedExecutorService en el inicio de la aplicación?

StackOverflow https://stackoverflow.com/questions/8422789

  •  29-10-2019
  •  | 
  •  

Pregunta

Estoy intentando crear funcionalidad en una aplicación web JSF1.2/ADF que generará periódica y dinámicamente un mapa del sitio para un sitio web que tendrá cientos de páginas cuyo contenido cambiará diariamente. El problema es que necesito leer alguna configuración de la aplicación para usar como base del mapa del sitio y para hacerlo, necesito Facescontext.

Esto es lo que he intentado hacer: creé una clase que implementa un ServletContextListener e instancia una aplicación para alcanzar el frijol. Este bean hace el trabajo pesado para crear siteMap.xml usando Facescontext. Creé una clase que extiende TimeTask que accede al Bean desde el alcance de la aplicación, llama al método del mapa del sitio y programa los sucesos futuros. Cuando ejecuto la aplicación, la clase que implementa ServletContextListener se dispara y el frijol parece ser creado, pero la clase que extiende TimeTask nunca se dispara. Cualquier ayuda sería apreciada. Si puedo responder alguna pregunta o si dejé algo, hágamelo saber.

Aquí están mis muestras de código:

public class WebhomesApplicationContextListener implements ServletContextListener {
 private static final String attribute = "SiteMapGenerator";
  public void contextInitialized(ServletContextEvent event) {
  SiteMapGenerator myObject = new SiteMapGenerator();
  event.getServletContext().setAttribute(attribute, myObject);
 }
 public void contextDestroyed(ServletContextEvent event) {
  SiteMapGenerator myObject = (SiteMapGenerator) event.getServletContext().getAttribute(attribute);
  event.getServletContext().removeAttribute(attribute);
 }
}

public class SiteMapGenerator {
 public void generateSitemap() {
   // code to generate map...
 }
}

public class Scheduler extends TimerTask {
 public void run() {
  SiteMapGenerator sitemap = (SiteMapGenerator)FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get("SiteMapGenerator");
  sitemap.generateSitemap();
 }
}

class MainApplication {
 public static void main(String[] args) {
  Timer timer = new Timer();
  timer.schedule(
   new Scheduler(),
   1000 * 60);
 }
}

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top