2

在我的 web 应用程序中,我使用 Quartz 在某个时间间隔调用某个类中定义的方法,该方法作为参数之一采用指向我的 WebContent 目录中的 css 文件的路径。我的问题是如何从非 servlet 类中获取该 css 文件的路径。

我确实尝试过的一件事是我让调用该方法的类扩展了,HttpServlet以便我可以调用

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

但这不起作用,我的应用程序就挂在那条线上。我不想硬编码路径,因为这似乎不专业:)

4

3 回答 3

3

您不能从 Quartz 作业访问 servlet 上下文,因为该作业不是作为请求处理管道的一部分调用的。

为什么不直接将 CSS 文件路径作为作业的参数,以便它可以由 servlet/web-code 调度/调用 Quartz 作业传递?有关示例,请参阅Quartz 文档。

于 2012-05-22T16:06:41.767 回答
1

如果将文件放在 Web 应用程序的 WEB-INF/classes 目录中,则可以使用 getResourceAsStream() 访问它。这将与 WAR 文件一起使用;getRealPath() 不会。

为什么 Quartz 需要知道 .css 文件?那应该是纯粹的看法。

于 2012-05-22T16:07:14.660 回答
0

不,我们可以从 Quartz 作业访问 servlet 上下文。

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

在 Quartz 工作中,我们可以得到如下的 servlet 上下文。

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
    ServletContext servletContext = (ServletContext) context.getMergedJobDataMap().get("servletContext");
    //...
}
于 2014-05-15T10:24:32.293 回答