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

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

}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值