http://www.oschina.net/code/snippet_114990_4440
最近项目中要做个定时生成静态html文件东东,7点到19点每5分钟生成一次,其他时间1小时生成一次,刚开始就走错了 居然想用一条cron表达式搞定,搞了半天,问了好多人,得到一个好的办法,就是给以个job创建多个触发器,不扯了,看代码。。
创建job并给job添加多个触发器
package com.f139.frame.job; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import static org.quartz.CronScheduleBuilder.cronSchedule; import java.text.ParseException; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.nutz.ioc.Ioc; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.TriggerKey; import org.quartz.impl.StdSchedulerFactory; import com.f139.frame.pojo.factory.Template; public class CreateJob { private static SchedulerFactory sf = new StdSchedulerFactory(); public static void createTemplateJob(Map<Integer, Template> map, Ioc ioc) { Scheduler sched; try { sched = sf.getScheduler(); // ioc参数,将ioc传递到job中 Map<String, Object> params = new HashMap<String, Object>(); params.put("ioc", ioc); // 获取所有模板 Collection<Template> templates = map.values(); for (Template template : templates) { if (template.getIntervalTime() > 0) { // 将当前模板ID传入job中 params.put("templateID", template.getTemplateID()); // 创建作业 JobDetail jobDetail = newJob(TemplateJob.class).withIdentity(new JobKey("templateJob_" + template.getTemplateID(), "template")).usingJobData( new JobDataMap(params)).build(); // 创建触发器,并将触发器加入到作业中 sched.scheduleJob(jobDetail, newTrigger().withIdentity(new TriggerKey("between7and19_" + template.getTemplateID(), "template")).withSchedule( cronSchedule("0 0/1 7-19 * * ?")).forJob(jobDetail).build()); sched.scheduleJob(newTrigger().withIdentity(new TriggerKey("between0and7_" + template.getTemplateID(), "template")).withSchedule( cronSchedule("0 0/5 0-7 * * ?")).forJob(jobDetail).build()); sched.scheduleJob(newTrigger().withIdentity(new TriggerKey("between19and23_" + template.getTemplateID(), "template")).withSchedule( cronSchedule("0 0/5 19-23 * * ?")).forJob(jobDetail).build()); } } sched.start(); } catch (SchedulerException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } }
job处理类
package com.f139.frame.job; import java.util.Map; import org.nutz.dao.Dao; import org.nutz.ioc.Ioc; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import com.f139.frame.freemarker.FreemarkerUtile; import com.f139.frame.pojo.factory.Log; import com.f139.frame.pojo.factory.Template; import com.f139.frame.system.LocalCache; import com.f139.frame.util.DateUtil; public class TemplateJob implements Job { private Dao dao = null; private Ioc ioc = null; @Override @SuppressWarnings("unchecked") public void execute(JobExecutionContext context) throws JobExecutionException { Map<String, Object> params = null; Template template = null; FreemarkerUtile freemarkerUtile = null; try { // 获取参数 params = context.getJobDetail().getJobDataMap(); // 获取ioc ioc = (Ioc) params.get("ioc"); // 获取Dao dao = ioc.get(NutDao.class,"dao"); // 获取当前模板 template = LocalCache.selectTemplateByID.get(Integer.parseInt(params.get("templateID").toString())); // 获取FreemarkerUtile freemarkerUtile = ioc.get(FreemarkerUtile.class, "freemarkerUtile"); // 创建文件 freemarkerUtile.createHtml(template.getTemplateContent(), template.getFileUrl(), null); } catch (Exception e) { FailLog("模板" + template.getTemplateName() + "在" + DateUtil.getNowString() + "生成静态文件时发生异常!"); } } public void FailLog(String message) { Log log = new Log(); log.setUserName("admin"); log.setLogClass("html"); log.setLogLevel("9"); log.setLogMessage(message); log.setUpdateTime(DateUtil.getNowString()); dao.insert(log); } }