在我的webapp中,我使用Quartz以某个间隔调用某个类中定义的方法,该方法作为参数之一,在我的WebContent目录中获取了一个css文件的路径。我的问题是如何从非servlet类中获取该css文件的路径。
我尝试过的一件事是我调用该方法的类扩展了HttpServlet
以便我可以调用
String contextPath = getServletContext().getRealPath("");
但这不起作用,我的应用程序只挂在那一行。 我不想对路径进行硬编码,因为这似乎是不专业的:)
答案 0 :(得分:3)
您无法从Quartz作业访问servlet上下文,因为作为请求处理管道的一部分不会调用作业。
为什么不将CSS文件路径作为作业的参数,以便它可以通过servlet / web-code调度/调用Quartz作业来传递?有关示例,请参阅the Quartz documentation。
答案 1 :(得分:1)
如果将文件放在Web应用程序的WEB-INF / classes目录中,则可以使用getResourceAsStream()访问它。这将适用于WAR文件; getRealPath()不会。
为什么Quartz需要知道.css文件?那应该是纯粹的观点。
答案 2 :(得分: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");
//...
}