定时器设置及同服务器一块启动和关闭

来源:互联网 发布:淘宝二手回收在哪里 编辑:程序博客网 时间:2024/04/28 07:16

第一步,定时器同服务器一块启动,需要用到监听. 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 ? * *"每天早上1015触发     "0 15 10 * * ?"每天早上1015触发     "0 15 10 * * ? *"每天早上1015触发     "0 15 10 * * ? 2005" 2005年的每天早上1015触发     "0 * 14 * * ?"每天从下午2点开始到259分每分钟一次触发     "0 0/5 14 * * ?"每天从下午2点开始到255分结束每5分钟一次触发     "0 0/5 14,18 * * ?"每天的下午2点至2556点至655分两个时间段内每5分钟一次触发     "0 0-5 14 * * ?"每天14:0014:05每分钟一次触发     "0 10,44 14 ? 3 WED"三月的每周三的14101444触发     "0 15 10 ? * MON-FRI"每个周一、周二、周三、周四、周五的1015触发     "0 15 10 15 * ?"每月15号的1015触发     "0 15 10 L * ?"每月的最后一天的1015触发     "0 15 10 ? * 6L"每月最后一个周五的1015     */}



原创粉丝点击