第一步,定時器同服務器一塊啓動,需要用到監聽. web.xml文件中配置如下代碼
<listener> <listener-class>com.sicmed.common.listerner.TimingTaskSchedule</listener-class> </listener>然後寫對應的監聽類,代碼如下:
public class TimingTaskSchedule implements ServletContextListener { // 服務器啓動時執行該事件 public void contextInitialized(ServletContextEvent arg0) { try { QuartzLoad.run(); } catch (Exception e) { e.printStackTrace(); } } // 服務器停止時執行該事件 public void contextDestroyed(ServletContextEvent arg0) { try { QuartzLoad.stop(); } catch (Exception e) { e.printStackTrace(); } } }繼續寫監聽類中執行的方法(定時任務),代碼如下:
public class QuartzLoad { public static void run() { LoggerUtils.debug(TimingQueryJob.class, "====================定時任務執行===================" + new Date() + "==============="); TimingQueryJob timingQueryJob = new TimingQueryJob(); String jobName = "quartz"; String jobGroupName = "b"; String triggerName = "c"; String triggerGroupName = "d"; //每天晚上11點執行0 * 23 * * ? try { //每天凌晨兩點執行定時器 QuartzManager.addJob(jobName, jobGroupName, triggerName, triggerGroupName, timingQueryJob, "0 * 2 * * ?"); } catch (SchedulerException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } //停止 public static void stop() { try { QuartzManager.removeJob("quartz", "b", "c", "d"); LoggerUtils.debug(TimingQueryJob.class, "==============定時任務結束===========" + new Date() + "==============="); } catch (SchedulerException e) { e.printStackTrace(); } } }上述代碼需要在pom.xml文件中引入quartz定時器jar(注意版本,不同版本定時器配置有區別)
<dependency> <artifactId>quartz</artifactId> <groupId>org.opensymphony.quartz</groupId> <version>1.6.1</version> </dependency>對上述定時器做個介紹:
jobName:任務名稱 jobGroupName:任務組名 triggerName:觸發器名稱 triggerGroupName:觸發器組名 (我的項目中這些字段爲了確定開啓和關閉定時器隨便寫的)
還有一個定時器啓動個關閉的管理類,代碼如下:(附帶定時器時間例子)
public class QuartzManager { private static SchedulerFactory sf = new StdSchedulerFactory(); private static String JOB_GROUP_NAME = "defaultGroup"; //默認任務組名 private static String TRIGGER_GROUP_NAME = "defaultTrigger"; //觸發器組名 /** * 添加一個定時任務 * * @param jobName 任務名 * @param jobGroupName 任務組名 * @param triggerName 觸發器名 * @param triggerGroupName 觸發器組名 * @param job 任務 * @param time 時間設置,參考quartz說明文檔 */ public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName,Job job, String time) throws SchedulerException, ParseException { Scheduler sched = sf.getScheduler(); JobDetail jobDetail = new JobDetail(jobName, jobGroupName, job.getClass());//任務名,任務組,任務執行類 //觸發器 CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);//觸發器名,觸發器組 trigger.setCronExpression(time);//觸發器時間設定 sched.scheduleJob(jobDetail, trigger); if (!sched.isShutdown()) sched.start(); } /** * 修改一個任務的觸發時間(使用默認的任務組名,觸發器名,觸發器組名) * * @param jobName * @param time * @throws SchedulerException * @throws ParseException */ public static void modifyJobTime(String jobName, String time) throws SchedulerException, ParseException { Scheduler sched = sf.getScheduler(); Trigger trigger = sched.getTrigger(jobName, TRIGGER_GROUP_NAME); if (trigger != null) { CronTrigger ct = (CronTrigger) trigger; ct.setCronExpression(time); sched.resumeTrigger(jobName, TRIGGER_GROUP_NAME); } } /** */ /** * 修改一個任務的觸發時間 * * @param triggerName * @param triggerGroupName * @param time * @throws SchedulerException * @throws ParseException */ public static void modifyJobTime(String triggerName, String triggerGroupName, String time) throws SchedulerException, ParseException { Scheduler sched = sf.getScheduler(); Trigger trigger = sched.getTrigger(triggerName, triggerGroupName); if (trigger != null) { CronTrigger ct = (CronTrigger) trigger; //修改時間 ct.setCronExpression(time); //重啓觸發器 sched.resumeTrigger(triggerName, triggerGroupName); } } /** */ /** * 移除一個任務(使用默認的任務組名,觸發器名,觸發器組名) * * @param jobName * @throws SchedulerException */ public static void removeJob(String jobName) throws SchedulerException { Scheduler sched = sf.getScheduler(); sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);//停止觸發器 sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);//移除觸發器 sched.deleteJob(jobName, JOB_GROUP_NAME);//刪除任務 } /** */ /** * 移除一個任務 * * @param jobName * @param jobGroupName * @param triggerName * @param triggerGroupName * @throws SchedulerException */ public static void removeJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName) throws SchedulerException { Scheduler sched = sf.getScheduler(); sched.pauseTrigger(triggerName, triggerGroupName);//停止觸發器 sched.unscheduleJob(triggerName, triggerGroupName);//移除觸發器 sched.deleteJob(jobName, jobGroupName);//刪除任務 } /** * 定時器時間設置 * "0 0 12 * * ?"每天中午十二點觸發 "0 15 10 ? * *"每天早上10:15觸發 "0 15 10 * * ?"每天早上10:15觸發 "0 15 10 * * ? *"每天早上10:15觸發 "0 15 10 * * ? 2005" 2005年的每天早上10:15觸發 "0 * 14 * * ?"每天從下午2點開始到2點59分每分鐘一次觸發 "0 0/5 14 * * ?"每天從下午2點開始到2:55分結束每5分鐘一次觸發 "0 0/5 14,18 * * ?"每天的下午2點至2:55和6點至6點55分兩個時間段內每5分鐘一次觸發 "0 0-5 14 * * ?"每天14:00至14:05每分鐘一次觸發 "0 10,44 14 ? 3 WED"三月的每週三的14:10和14:44觸發 "0 15 10 ? * MON-FRI"每個週一、週二、週三、週四、週五的10:15觸發 "0 15 10 15 * ?"每月15號的10:15觸發 "0 15 10 L * ?"每月的最後一天的10:15觸發 "0 15 10 ? * 6L"每月最後一個週五的10:15 */ }