Servlets 在quartz调度程序中检索servletContext引用

Servlets 在quartz调度程序中检索servletContext引用,servlets,quartz-scheduler,Servlets,Quartz Scheduler,我在基于Spring3.0的应用程序中使用Quartz调度程序。我成功地创建了新的调度程序,它们工作正常 我已经看到了 但是。。我无法在quartz作业文件中检索servletContext。有谁能帮我在executeInternal()方法中检索servletContext引用吗?我也有类似的需要。我把它整理成了一个类似的方式 在我的servlet上下文侦听器中,我使用作业数据映射对象设置servlet上下文,然后为作业设置该对象: @Override public void

我在基于Spring3.0的应用程序中使用Quartz调度程序。我成功地创建了新的调度程序,它们工作正常

我已经看到了


但是。。我无法在quartz作业文件中检索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开始,如果您通过web.xml中的
QuartzInitializerServlet启动web应用程序中的调度程序,您可以在SchedulerContext中存储ServletContext,方法是将
调度程序上下文servlet context key
设置为init参数,如下所示:

<!-- 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>

石英初始化器
org.quartz.ee.servlet.QuartzInitializerServlet
卸载时关机
真的
加载时启动调度程序
真的
调度程序上下文servlet上下文键
清除请求
1.

请参阅代码中的以下参考:

要从QuartzJob配置中获取ServletContext,如Kalman所说,那么下面是一些获取实际“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());