第一步,定时器同服务器一块启动,需要用到监听. 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 */ }