我在基于Spring 3.0的应用程序中使用Quartz Scheduler。我成功地创建了新的调度程序,它们工作正常。
我见过reference.
但是..我无法在我的石英作业文件中检索servletContext。任何人都可以帮助我如何在executeInternal()方法中检索servletContext引用??
Gunjan Shah, THX。
答案 0 :(得分:6)
我有类似的需求。我以与the solution presented here.类似的方式对其进行了整理 在我的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 I found this link,那么在上一篇文章中,一个人提到实现ServletContextAware。就个人而言,我会选择JobDataMap,因为这是它的作用。
答案 1 :(得分:1)
从Quartz 2.0开始,如果您在web.xml中通过QuartzInitializerServlet
启动webapp中的调度程序,则可以通过将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>
答案 2 :(得分:0)
从QuartzJob配置到你的ServletContext就像Kalman说的那样,然后这里有一些代码来获得一个真正的&#34; servletContext&#34;
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());