JAVA基础--Quartz定时任务调度的简单应用(2)

咱们接着来学习Quartz的日历调度:java

CronTrigger的做用:jsp

       基于 日历 的 做业调度器, 而不像 SimpleTrigger 那样精确指定间隔时间,比SimpleTrigger更经常使用;
应用于每一个星期的星期几进行调度,每月的几号进行调度..等,这种复杂调度;函数

Cron表达式 : 工具

        用于配置CronTrigger实例.
        是由7个字表达式组成的字符串,描述了时间表的详细信息.
        格式: [秒] [分] [时] [日] [月] [周] [年]
        特殊字符意义对应表:学习

字段 是否必填 容许值 容许的特殊字符
0~59 , - * /
0~59 , - * /
0~23 , - * /
1~31 , - * / ? L W
1~12或JAN~DEC , - * /
1~7或SUN~SAT , - * / ? L #
empty,1970~2099 , - * /

      特殊字符的注释:ui

符号 注释
* 表示全部值, 例如:在分的字段上设置'*',表示每一分钟都会触发;
?        表示不指定值,使用的场景为不须要关心当前设置这个字段的值,例如须要在每个月的10号执行,但不关心是周几;因此能够在周的字段上设置'?';
- 表示区间.例如在小时上设置'10-12',表示10,11,12小时都会执行;
, 表示多指定多个值: 例如在周上指定'MON,WED,FRI'表示周一,周三,周五都会执行;
/       用于递增触发,如在秒上面设置"5/15"表示从5秒开始,每隔15秒触发(5,20,35,50).在月上设置"1/3",每个月1号开始,每隔3天触发一次;
L       表示最后的意思,在日上设置,表示当月最后一天(依据当前月份,若是是二月还依据当年是不是润年);在周字段上表示是星期六,至关于7或SAT; 若是在L前加数字,则表示该数据的最后一个,在周上设置'6L',表示本月最后一个星期五;
W       表示离指定日期最近的那个工做日(周一至周五).例如在日上设置'15W',表示离每个月15号最近的那个工做日触发.若是15号正好是周六,则14号周五触发,若是15号是周日,则16号周一触发;若是15号是工做日,则当天触发; 设置为'1W',则表示每个月一号后的工做日触发,若是1号为周六,则3号周一触发;(注: W前只能设置具体的数字,不能设置区间);
#       序号,表示每个月的第几个周几, 在周上设置'6#3'表示在每个月的第三个周五, 注意: '#5',当没有第五周的时候,不会触发该配置;

    提示: L,W 能够组合使用;
            周字段英文字母不区分大小写;
            利用工具在线生成: http://www.pdtools.net/tools/becron.jspspa

StdSchedulerFactory :
        (1), 使用一组参数(Java.util.Properties)来建立和初始化Quartz调度器;
        (2), 配置参数通常存储在quartz.properties中;
        (3), 调用getScheduler方法就能建立和初始化调度器对象;
Scheduler的主要函数:
        (1), Date scheduleJob(JobDetail jobDetail, Trigger trigger); 返回最近一次将要触发的时间;
        (2), void start(); 启动;
        (3), void standby(); 挂起; 继续调用 start(),能够唤醒;
        (4), void shutdown(); 关闭,不能被唤醒; 
                            shutdown(true):表示等待全部正在执行的Job执行完毕后,再关闭scheduler;
                            shutdown(false):表示直接关闭scheduler;
quartz.properties : 
    文档的位置和加载顺序: 优先读取项目目录下的quartz.properties文件;若是没有,则读jar包;
    组成部分: (1), 调度器属性; (2),线程池属性; (3),做业存储设施; (4),插件配置;
    调度器属性: 
        org.quartz.scheduler.instanceName属性用来区分特定的调度器实例,能够按照功能用途来给调度器起名.
        org.quartz.scheduler.instanceId属性和前者同样,也容许任何字符串,但这个值必须是在全部调度器实例中是惟一的,尤为是在一个集群当中,做为集群的惟一Key.假如你想Quartz帮你生成这个值的话,能够设置为AUTO;.net

示例: 插件

package quartz;

import java.text.SimpleDateFormat;
import java.util.Calendar;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 *@description  TODO CronTrigger日历时间调度
 *@date  2018/1/23
 *@author  geYang
 **/
public class HelloCronTrigger {
    
    public static void main(String[] args) throws Exception {
        Calendar calender = Calendar.getInstance();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob").build();
        
        CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger()
              .withIdentity("myTrigger")
              .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 10 ? * *"))
              .build();
        /**
         * Cron 表达式:
         * 用于配置CronTrigger实例.是由7个字表达式组成的字符串,描述了时间表的详细信息.格式: [秒] [分] [时] [日] [月] [周] [年]
         * 例:
         *  1,每秒中执行: "* * * * * ? *"
         *  2,天天10点15分触发: "0 15 10 ? * *" ; "0 15 10 * * *"
         *  3,天天下午的10:00~10:59,每隔五分钟执行一次: "0 0/1 10 * * ?"
         *  4,周一到周五,天天上午10:15触发: "0 15 10 ? * 2-6" ; "0 15 10 ? * MON-FRI"
         *  5,每个月的第三周的星期五的10:15触发 : "0 15 10 ? * 6#3" (注: '6'=>星期五; '3'=>第三周 ; '6#3'=>第三周星期五)
         *  6,从2017年到2018年每个月最后一周的星期五的10:15分触发: "0 15 10 ? * 6L 2017-2018" (注: '6'=>星期五; 'L'=>最后一周; "6L"=>最后一周的星期五)
         *  7,天天的 10:00~10:59以及 18:00~18:59每隔5秒执行一次: "0/5 * 10,18 * * ?"
         * */
        // 建立 Scheduler 实例;
        SchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.scheduleJob(jobDetail, trigger);
        System.out.println("当前时间:"+sf.format(calender.getTime()));
        scheduler.start();
    }
    
}
相关文章
相关标签/搜索