• Java EE学习——Quartz的Cron表达式


    经历过低谷后,还是要好好学习,越失落会越来越落后。

    今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧。

    Cron表达式是Quartz的精髓(个人觉得),比如我们想设定淘宝“秒杀”的那一秒时间,完全可以用下面的方法设置执行时间。

    Calendar cal = Calendar.getInstance();
    //设置将要发生的时间...
    cal.set(Calendar.DATE, xxx);
    //.......常规的生成scheduler和job
    //Trigger设置为这个日期
    Trigger trigger = TriggerBuilder.newTrigger().startAt(cal.getTime()).build();
    //接着还是一般的流程

    可以百度或者参加我前一篇博客《Java EE学习--Quartz基本用法》了解一下Quartz最简单的用法。

    这里说到Cron表达式:比如公司每天上下班打卡,一周周末检查工作完成情况,网站每月统计用户数据,等等,这些情况想通过一个Date来设置,非常的麻烦,而且会开大量的实例,影响效率。

    我们还是举一个最简单的例子,继承Job类,重写一个execute方法:

    public class MyJob3 implements Job
    {
        public void execute(JobExecutionContext ctx) throws JobExecutionException
        {
            System.out.println("It's Time for me to run!!WUHA╰_╯");
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println("now time is:"+format.format(new Date()));
        }
    }

    然后,使用CronTrigger来实现带Cron表达式的触发器:

        public static void main(String[] args) throws Exception
        {
            SchedulerFactory factory = new StdSchedulerFactory();
            Scheduler sche = factory.getScheduler();
            
            JobDetail job = JobBuilder.newJob(MyJob3.class).build();
            //cron表达式说明
            /*
             *    六个或七个单元
             * 秒 分 时 月中天 月份 月中星期几 (年)
             * 秒,分,时,天
             * 字段 允许值 允许的特殊字符
                秒 0-59 , - * /
                分 0-59 , - * /
                小时 0-23 , - * /
                日期 1-31 , - * ? / L W C
                月份 1-12 或者 JAN-DEC , - * /
                星期 1-7 或者 SUN-SAT , - * ? / L C #
                年(可选) 留空, 1970-2099 , - * / 
             
             * 符号说明
                星号:表示任意时刻
                问号:只能在日或周字段上使用,简单的理解就是日期和星期是有冲突的,指定其中一个的话,另外一个是没办法指定的,比如每个月12号和每个星期二,这两个是"互斥"的,不能用日期和周来指定所有“每个是星期二的12号”这个时间。
                减号:范围,如 1-5秒
                逗号:列表,如 1,5,10 秒
                斜杠:等步长序列,如3/13秒 表示 3,16,29,42,55,3,16...
                L:仅在日和周上支持,表示允许的最后一个值,注意不要让范围和列表与L连用
                W:工作日
                井号:为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。 
             */
            //秒 分 时 月中天 月份 月中星期几 (年)
            String cron = "0/10 * * 8W 8 ? 2008-2015";
       
            CronTrigger trigger = TriggerBuilder.newTrigger().
                                                        withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
            System.out.println("now is:"+new Date());
            sche.scheduleJob(job,trigger);
            sche.start();
            Thread.sleep(180*1000);
            sche.shutdown();
        }

    很简单的把Cron用法在代码中的注释写了,大家可以在百度上搜索具体的用法,这里我复制别人的没有意思,可以参见http://xgw1008.blog.163.com/blog/static/567573562009316011544/

    月份和日期都是从1开始的,不是从0,一般你常规认为的时间是几月几号,在Cron中就应该写多少。

    以我的

    0/10 * * 8W 8 ? 2008-2015

    作说明:

    从2008年到2015年(实际中年份可不写),8月份距离8号最近的工作日(几号后面加W,今天,如果是9W,那么还是取最近的工作日,还是今天),倒数第二个是?号表示和已经写上去的8号互斥,每时每分,从0秒开始每隔10秒触发(秒数除以10余0),效果如下:

    now is:Fri Aug 08 10:07:41 CST 2014
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:07:50
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:08:00
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:08:10
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:08:20
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:08:30
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:08:40
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:08:50
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:09:00
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:09:10
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:09:20
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:09:30
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:09:40
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:09:50
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:10:00
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:10:10
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:10:20
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:10:30
    It's Time for me to run!!WUHA╰_╯
    now time is:2014-08-08 10:10:40

    完全是按照已制定的想法来的,每隔10秒显示一次,Quartz的功能真的非常强大!

  • 相关阅读:
    关于冥想
    Read Later
    你追求的跟我相反
    UML for Java Programmers之dx实战
    20140525
    面试基础-语言基础篇
    面试基础-linux操作系统篇
    面试基础-数据库篇
    面试基础-计算机网络篇
    Eclipse同时编译多个cpp文件
  • 原文地址:https://www.cnblogs.com/gaozhenxi/p/3898764.html
Copyright © 2020-2023  润新知