Obtención de una ruta de contexto en una clase que no es de servlet

En mi aplicación web, estoy usando Quartz para llamar a un método definido en alguna clase en algún intervalo, ese método como uno de los argumentos toma una ruta a un archivo css en mi directorio WebContent. Mi pregunta es cómo puedo obtener la ruta a ese archivo css desde una clase que no es de servlet.

Una cosa que probé fue que hice que la clase que llama al método extendiera el HttpServlet para poder hacer una llamada

String contextPath = getServletContext().getRealPath("");

pero eso no funcionó y mi aplicación simplemente se cuelga en esa línea. No quiero codificar la ruta ya que parece poco profesional :)

preguntado el 22 de mayo de 12 a las 17:05

3 Respuestas

No puede acceder al contexto del servlet desde el trabajo de Quartz ya que el trabajo no se invoca como parte de la canalización de manejo de solicitudes.

¿Por qué no simplemente hacer que la ruta del archivo CSS sea un argumento para el trabajo, de modo que pueda ser pasado por el servlet/programación de código web/invocación del trabajo de Quartz? Ver la documentación de Quartz para un ejemplo.

contestado el 22 de mayo de 12 a las 17:05

El trabajo programado por cuarzo es un método que toma como uno de los argumentos la ruta del archivo css. - astutomummin

y cuando su código programa el trabajo, ¿pasa el valor del argumento a Quartz, en el JobDetail.setJobDataMap() ? - mate b

Si coloca un archivo en el directorio WEB-INF/classes de su aplicación web, puede acceder a él mediante getResourceAsStream(). Esto funcionará con un archivo WAR; getRealPath() no lo hará.

¿Por qué Quartz necesita saber acerca de un archivo .css? Eso debería ser puramente vista.

contestado el 22 de mayo de 12 a las 17:05

A Quartz no le importa el archivo .css. Es el método llamado por el cuarzo requiere ruta css - astutomummin

No puedo imaginar por qué. Quartz programa una tarea en el lado del servidor; .css debe ser sobre la vista. Todavía no lo entiendo, pero entonces no tengo que hacerlo. Buena suerte. - duffymo

No, podemos acceder al contexto del servlet desde el trabajo de Quartz.

@Override
public void contextInitialized(ServletContextEvent sce) {
    try {
        //Create & start the scheduler.
        StdSchedulerFactory factory = new StdSchedulerFactory();
        factory.initialize(sce.getServletContext().getResourceAsStream("/WEB-INF/my_quartz.properties"));
        scheduler = factory.getScheduler();
        //pass the servlet context to the job
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("servletContext", sce.getServletContext());
        // define the job and tie it to our job's class
        JobDetail job = newJob(ImageCheckJob.class).withIdentity("job1", "group1").usingJobData(jobDataMap).build();
        // Trigger the job to run now, and then repeat every 3 seconds
        Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow()
              .withSchedule(simpleSchedule().withIntervalInMilliseconds(3000L).repeatForever()).build();
        // Tell quartz to schedule the job using our trigger
        scheduler.scheduleJob(job, trigger);
        // and start it off
        scheduler.start();
    } catch (SchedulerException ex) {
        log.error(null, ex);
    }
}

En el trabajo de Quartz, podemos obtener el contexto de servlet como se muestra a continuación.

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
    ServletContext servletContext = (ServletContext) context.getMergedJobDataMap().get("servletContext");
    //...
}

contestado el 15 de mayo de 14 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.