最近在项目中,要用到定时器,需要每个月清理一次服务器端的某个临时文件夹。自然而然就想到了quartz,但是以前只是挺同事说起过,自己还没真正的用过,现在就自己动手来做一个吧,先从google开始,呵呵。
参看了google的一些资料以后,大致了解了一下。先给出官方的api地址吧:[url]http://opensymphony.com/quartz/api/[/url]。先去下载quartz的jar包吧。我用的是quartz-1.5.2.jar。使用quartz,首先你需要创建一个job类,这个类要实现org.quartz.Job接口,然后实现它的execute方法,这个execute方法里面执行的操作,就是最终你的定时器要完成的业务了。
先给出我的一段代码吧:
然后就是新建一个servlet继承org.quartz.ee.servlet.QuartzInitializerServlet可以去看看这个类的api,里面写的非常详细。
代码如下:
如果是比较简单的定时器,可以直接通过TriggerUtils类来获得Trigger,他里面有每天触发,每个星期触发,每个月触发等等函数。如果是比较复杂的话,可以创建Trigger的两个子类来实现,详见api。通过TriggerUtils类来创建的Trigger,默认的开始时间都是‘now’,也就是web应用启动的时候。当然你也可以自己设置。
最后在web.xml里面配置一下上面的servlet就行了。<load-on-startup>1</load-on-startup>,随web应用而装载。
参看了google的一些资料以后,大致了解了一下。先给出官方的api地址吧:[url]http://opensymphony.com/quartz/api/[/url]。先去下载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应用而装载。