我在基于 spring 3.0 的应用程序中使用 Quartz Scheduler。我成功地创建了新的调度程序,它们工作正常。
我见过这样的参考。
但是.. 我无法在我的石英作业文件中检索 servletContext。谁能帮助我如何在 executeInternal() 方法中检索 servletContext 引用?
我在基于 spring 3.0 的应用程序中使用 Quartz Scheduler。我成功地创建了新的调度程序,它们工作正常。
我见过这样的参考。
但是.. 我无法在我的石英作业文件中检索 servletContext。谁能帮助我如何在 executeInternal() 方法中检索 servletContext 引用?
我也有类似的需求。我以与此处介绍的解决方案类似的方式对其进行了整理。 在我的 servlet 上下文侦听器中,我使用作业数据映射对象设置 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);
}
}
然后在我的工作中,我正在这样做:
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
ServletContext servletContext = (ServletContext) context.getMergedJobDataMap().get("servletContext");
//...
}
编辑: 另外,既然你提到你正在使用 Spring ,我发现了这个链接,在上一篇文章中,有人提到实现 ServletContextAware。就个人而言,我会选择 JobDataMap,因为这是它的作用。
从 Quartz 2.0 开始,如果您通过QuartzInitializerServlet
web.xml 在 webapp 中启动调度程序,您可以通过将 ServletContext 设置scheduler-context-servlet-context-key
为 init 参数来将 ServletContext 存储在 SchedulerContext 中,如下所示:
<!-- Quartz Scheduler Initializer Servlet -->
<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
<init-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>start-scheduler-on-load</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>scheduler-context-servlet-context-key</param-name>
<param-value>servletContext</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
要像 Kalman 所说的那样从 QuartzJob 配置中获取您的 ServletContext,那么这里有一些代码来获取实际的“servletContext”
private void initContext(JobExecutionContext jobContext) {
Scheduler scheduler = jobContext.getScheduler();
SchedulerContext schedulerContext = null;
try {
schedulerContext = scheduler.getContext();
} catch (SchedulerException e) {
e.printStackTrace();
}
ServletContext servletContext = (ServletContext)schedulerContext.get("servletContext");
System.out.println("ServletContextName : "+ servletContext.getServletContextName());