Spring quartz中取得ServletContext

在开发javaWeb定时任务的时候,有些处理要取得应用的相对路径,这就需要用到ServletContext取得到这个路径

解决思路是在web应用启动时,把ServletContext提前注入到Scheduler的Context中

注册一个应用启动的listener

   <listener>
      <listener-class>com.krm.slsint.common.web.listener.StartupListener</listener-class>
   </listener>

在listener中给scheduler加入ServletContext

需要引入:

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;

 1 public class StartupListener implements ServletContextListener,HttpSessionAttributeListener,HttpSessionListener
 2  {
 3      public void contextInitialized(ServletContextEvent event)
 4      {
 5          try{
 6              Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
 7              scheduler.getContext().put("ServletContextForScheduler", event.getServletContext());  
 8              event.getServletContext().setAttribute(Constants.SCHEDULER_KEY,
 9                 scheduler);
10          catch (SchedulerException e){
11                      e.printStackTrace();
12              }
13          }
14      }
15 
16     public void contextDestroyed(ServletContextEvent event) {
17         Scheduler scheduler = (Scheduler) event.getServletContext().getAttribute(
18                 Constants.SCHEDULER_KEY);
19         if (scheduler != null) {
20             try {
21                 scheduler.shutdown(true);
22             } catch (SchedulerException e) {
23                 if (log.isDebugEnabled()) {
24                     log.debug(e.getMessage());
25                 }
26             }
27         }
28         servletContext = null;
29     }

 

从JobExecutionContext中读出ServletContext,可以取得中间件路径

 1 public class BatchMailSendJob extends QuartzJobBean {
 2     @Override
 3     protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
 4         try {
 5             ServletContext servletContext = (ServletContext) context.getScheduler()
 6                     .getContext().get("ServletContextForScheduler");
 7             String dir = servletContext.getRealPath(File.separator);
 8         } catch (FileNotFoundException e) {
 9             // TODO Auto-generated catch block
10             e.printStackTrace();
11         } catch (SchedulerException se) {
12             // TODO Auto-generated catch block
13             se.printStackTrace();
14         }
15     }
16 }

下面是quartz的配置applicationContext-timertask.xml

<beans>
    <bean name="mailJob"  class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass">
            <value>com.krm.slsint.mail.task.BatchMailSendJob</value>
        </property>
        <property name="jobDataAsMap">
            <map>
                <entry key="timeout">
                    <value>5</value>
                </entry>
            </map>
        </property>
    </bean>
    <bean id="mailCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="mailJob"/>
        </property>
        <property name="cronExpression">
             <value>0 0/10 9-23 * * ? </value>
        </property>
    </bean>
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref local="mailCronTrigger"/>
            </list>
        </property>
    </bean>
</beans>

 

posted @ 2016-01-15 16:37  何鸿涛  阅读(730)  评论(0)    收藏  举报