java定时器 quartz

最近在项目中,要用到定时器,需要每个月清理一次服务器端的某个临时文件夹。自然而然就想到了quartz,但是以前只是挺同事说起过,自己还没真正的用过,现在就自己动手来做一个吧,先从google开始,呵呵。
参看了google的一些资料以后,大致了解了一下。先给出官方的api地址吧: http://opensymphony.com/quartz/api/。先去下载quartz的jar包吧。我用的是quartz-1.5.2.jar。使用quartz,首先你需要创建一个job类,这个类要实现org.quartz.Job接口,然后实现它的execute方法,这个execute方法里面执行的操作,就是最终你的定时器要完成的业务了。
先给出我的一段代码吧:
public class DeleteReportTempJob implements Job {

	@SuppressWarnings("unchecked")
	public void execute(JobExecutionContext context) throws JobExecutionException
	{
        // 获得jobDetail传过来的参数 
		Map<String,Object> map = context.getJobDetail().getJobDataMap();
		ServletContext servletContext = (ServletContext)map.get("servletContext");
		String reportTemplatePath = servletContext.getRealPath("/WEB-INF") + System.getProperty("file.separator");
		reportTemplatePath = reportTemplatePath.replace('\\', '/');

        // 获得临时文件夹的路径
		String dir = reportTemplatePath.substring(0, reportTemplatePath.indexOf("/WEB-INF")) + "/reportTemp/";

        File file = new File(dir);
        
        try
        {
        	if(file.exists() && file.isDirectory())
        	{
        		// Cleans a directory without deleting it.
            	FileUtils.cleanDirectory(file);
        	}
        }
        catch(IOException e)
        {
        	e.printStackTrace();
        }
	}

}


然后就是新建一个servlet继承org.quartz.ee.servlet.QuartzInitializerServlet可以去看看这个类的api,里面写的非常详细。
代码如下:
	/**
	 * 初始化
	 * @param ServletConfig cfg
     * @return 
	 */
	public void init(ServletConfig cfg) throws javax.servlet.ServletException 
	{
		super.init(cfg);
		run(cfg);
	}
	
	/**
	 * 创建一个调度器<code>Scheduler<code>的实例。
	 * 实例化一个监控定制报表表的线程,并启动该线程。
	 * @param ServletConfig cfg
     * @return 
	 */
	public void run(ServletConfig cfg)
	{
		ServletContext servletContext = cfg.getServletContext();
		SchedulerFactory factory = (SchedulerFactory)cfg.getServletContext().getAttribute(QUARTZ_FACTORY_KEY);
		Scheduler sched;
		try 
		{
			sched = factory.getScheduler();
			sched.start();
			JobDetail jobDetail = new JobDetail(jobName, Scheduler.DEFAULT_GROUP,   
					DeleteReportTempJob.class);  
			// 将ServletContext对象放到map中,然后从job中取出来,从而取得路径
			Map<String,Object> map = new HashMap<String,Object>();
			map.put("servletContext", servletContext);
			JobDataMap dateMap = new JobDataMap(map);
			jobDetail.setJobDataMap(dateMap);
			
			// fire at the first day 00:00 in every month, start right now  
			Trigger trigger = TriggerUtils.makeMonthlyTrigger(triggerName, 1, 0, 0);
			// test code
			// SimpleTrigger trigger = new SimpleTrigger("testTrigger"+triggerName, Scheduler.DEFAULT_GROUP,0,90000);
			
			// start on the next hour  
			// trigger.setStartTime(TriggerUtils.getEvenHourDate(new Date())); 
			
			// start on the next minute
			// trigger.setStartTime(TriggerUtils.getEvenMinuteDate(new Date())); 
			sched.scheduleJob(jobDetail, trigger);
		} 
		catch (SchedulerException e) 
		{
			e.printStackTrace();
		}
		
	}

如果是比较简单的定时器,可以直接通过TriggerUtils类来获得Trigger,他里面有每天触发,每个星期触发,每个月触发等等函数。如果是比较复杂的话,可以创建Trigger的两个子类来实现,详见api。通过TriggerUtils类来创建的Trigger,默认的开始时间都是‘now’,也就是web应用启动的时候。当然你也可以自己设置。

最后在web.xml里面配置一下上面的servlet就行了。<load-on-startup>1</load-on-startup>,随web应用而装载。

你可能感兴趣的:(java,应用服务器,Web,servlet,quartz)