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>

浙公网安备 33010602011771号