定時器設置及同服務器一塊啓動和關閉

第一步,定時器同服務器一塊啓動,需要用到監聽. 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
     */

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章