本文来自:http://www.blogjava.net/crazycy/archive/2013/06/06/400287.html

每次使用Quartz Cron的时候都要去查manual document;
(URI:http://quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger)

对于第四个day of month 和 第六个 day of week常常需要花时间,这里做个简单总结

*    *   *     *    *    *   (year optional)
┬   ┬    ┬    ┬    ┬    ┬
│   │    │    │    │    │
│   │    │    │    │    │
│   │    │    │    │    └───── day of week (0 - 7) (0 or 7 is Sun, or use names)
│   │    │    │    └────────── month (1 - 12)
│   │    │    └─────────────── day of month (1 - 31)
│   │    └──────────────────── hour (0 - 23)
│   └───────────────────────── min (0 - 59)
└────────────────────────      seconds
Wild-cards (the * character) can be used to say "every" possible value of this field. 
Therefore the * character in the "Month" field simply means "every month". 
A '*' in the Day-Of-Week field would therefore obviously mean "every day of the week".

The '?' character is allowed for the day-of-month and day-of-week fields. 
It is used to specify "no specific value". This is useful when you need to specify something in one of the two fields, but not the other.

为了解释清楚“?"字符的使用,再来一段

Field Name    Mandatory    Allowed Values    Allowed Special Characters
Seconds         YES            0-59                        , - * /
Minutes          YES            0-59                        , - * /
Hours             YES            0-23                        , - * /
Day of month  YES            1-31                        , - * ? / L W
Month             YES            1-12 or JAN-DEC      , - * /
Day of week    YES            1-7 or SUN-SAT        , - * ? / L #
Year                NO            empty, 1970-2099     , - * /

可以看到只有第四、六两个位置允许使用"?"
这就说明这2个位置是相互依赖的
? ("no specific value") - useful when you need to specify something in one of the two fields in which the character is allowed, but not the other. For example, if I want my trigger to fire on a particular day of the month (say, the 10th), but don't care what day of the week that happens to be, I would put "10" in the day-of-month field, and "?" in the day-of-week field. See the examples below for clarification.

所以一旦用了"?",就说明这个字段不起作用了,对应的另一个字段起作用;

所以:
1. 配置一个任务在每天凌晨2点运行做出截止到当日的报表,但是周末因为没人值班所以不需要生成报表,这个表达式就是
    0 0 2 ? * MON-FRI
2. 配置一个任务在每个月的最后一天夜里11点运行
    0 0 23 L * ?

如果想用数据库驱动这个时间怎么办呢?请问下面大虾的做法:

Dec 22nd, 2008, 01:53 AM #2 Siva Krishna  
Hello,

I got almost similar requirement, making the schedulers as DB driven, and handled it in the following way.

I created a new UI that takes start time & interval time and saves them in DB. Then a method is called to refresh the given jobs/schedulers.

Here is the snippet.

Code:
try {
    scheduler = (StdScheduler) context.getBean(schedulerVO.getSchedulerName());
    triggerNames = new String[] {};

if (scheduler != null) {
        try {
            // throws SchedulerException
            triggerNames = scheduler.getTriggerNames("DEFAULT");
            triggerName = triggerNames.length > 0 ? triggerNames[0] : "";
            trigger = (CronTrigger) scheduler.getTrigger(triggerName, "DEFAULT");
            if (trigger != null) {
                // throws ParseException                                    
                trigger.setCronExpression(getCronExpression(schedulerVO.getStartTime(), schedulerVO.getInterval()));

// throws SchedulerException
                scheduler.rescheduleJob(triggerName, "DEFAULT",trigger);
            } 
        } catch (SchedulerException e) {                    
            logger.error(e);
        } catch (ParseException e) {
            logger.error(e);
        }
    }
} catch (NoSuchBeanDefinitionException e) {
    logger.error(e);
}

Computing the cronExpression with this method.

Code:
private String getCronExpression(String startTime, String interval) {        
    String cronExpression = "";
    if ("0".equals(startTime) || "0".equals(interval)) {
        // default trigger runs at 10AM & 10PM            
            cronExpression = "0 0 10/12 * * ?";
    } else {
        cronExpression = "0 0 " + startTime + "/" + interval + " * * ?";
        }
    return cronExpression;
}
As I need to run the job every day and not concerned about minutes the above approach worked for me.

Hope this gives an idea to you.

Regards
Siva Krishna.

POSTED ON 2013-06-06 11:35 CRAZYCY 阅读(2095) 评论(1)  编辑  收藏 所属分类: JAVAEE技术

QUARTZ CRON的更多相关文章

  1. Quartz Cron 触发器 Cron Expression 的格式

    转自:http://blog.csdn.net/yefengmeander/article/details/5985064 上一文中提到 Cron触发器可以接受一个表达式来指定执行JOB,下面看看这个 ...

  2. Quartz Cron表达式的二三事

    最近在解决产品上的一个需求,就是定期生成报告(Report),我们叫做Scheduled Report. 原理:UI获取用户输入的时间信息,后台使用Spring框架设置定时任务,这里定时任务用的就是  ...

  3. Spring 调度工具Quartz cron 表达式的格式

    http://chinaxxren.iteye.com/blog/839630 Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别.区别之一就是 Quar ...

  4. Quartz cron 表达式(linux 定时器,java 定时任务,spring task定时任务)

    原文地址:https://blog.csdn.net/feng27156/article/details/39293403 Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但 ...

  5. Quartz 之Quartz Cron表达式

    说到这个Quartz了,必不可少的就要说到我们的Triggger触发器,相信大家也都知道,我们在之前也说过了,Trigger又有两个子类,也就是两种方式,分别是:SimpleTrigger和CronT ...

  6. Quartz Cron表达式生成器

    格式: [秒] [分] [小时] [日] [月] [周] [年]  序号 说明   是否必填  允许填写的值 允许的通配符   1  秒  是  0-59    , - * /  2  分  是  0 ...

  7. Quartz Cron表达式 每周、每月执行一次

    原文:https://blog.csdn.net/qq_33432559/article/details/75633767 系统中通常有些需要自动执行的任务,这些任务可能每隔一段时间就要执行一次,也可 ...

  8. [quartz] - Cron表达式举例

    Quartz是一个任务调度框架.比如你遇到这样的问题 想每月25号,信用卡自动还款 想每年2月14日自己给当年暗恋女神发一封匿名贺卡 想每隔1小时,备份一下自己的SpringCloud学习笔记到云盘 ...

  9. quartz cron表达式在线生成

    近期使用了quartz定时器,有感于起cron表达式有点复杂.且无法实时推断定时时间是否正确,因此写了个在线表达式及依据表达式获得前10次运行时间. 訪问地址例如以下:http://cron.g2ro ...

随机推荐

  1. 使用SqlCacheDependency依赖项让数据库变化后缓存失效

    SqlCacheDependency可以使缓存在数据库或者数据库某张表或者字段变化后让指定缓存失效.对于一些需要及时显示的信息比较有用. 需要.net2.0以后设sql server2005及以后版本 ...

  2. 涂抹Oracle笔记1-创建数据库及配置监听程序

    一.安装ORACLE数据库软件及创建实例OLTP:online transaction processing 指那些短事务,高并发,读写频繁的数据库系统.--DB_BLOCK_SIZE通常设置较小.O ...

  3. Oralce 按分隔符把一列转成多行

    1.前言 最近因项目需求,需要把员工的工作组返回给前台,但是数据库是把员工的工作组Id,都存在一个字段内了(以“逗号”分隔),而这样不符合前台的需要,他们需要一行,一行的数据.如: 数据库: user ...

  4. iOS学习资料整理

    视频教程(英文) 视频 简介 Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS S ...

  5. uploadify ,前端页面获取值,json,ajax

    针对这几月的技术,做一次小总结 上传控件uploadify function inexel() { $("#btnExcel").uploadify({ 'method': 'po ...

  6. android的编译和运行过程深入分析

    android的编译和运行过程深入分析 作者: 字体:[增加 减小] 类型:转载 首先来看一下使用Java语言编写的Android应用程序从源码到安装包的整个过程,此过程对了解android的编译和运 ...

  7. 基于方法的LINQ语句

    LINQ中的查询方法有两站,一种是使用类似于SQL语句的方式,另一种则是基于方法的语句.基于方法的查询方法使用的是C#中面向对象概念的,主要的方法有: 投影:  Select | SelectMany ...

  8. django第二个项目--使用模板

    第一步: 创建新项目secondproject cd /tmp/django-admin startproject secondeproject 第二步: 创建一个用于放置模板文件夹 cd /tmp/ ...

  9. 如何使用fiddler进行android手机测试

    一.什么是Fiddler Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的设备和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据,并且可以胡乱修改. F ...

  10. hdu 1337 The Drunk Jailer

    http://acm.hdu.edu.cn/showproblem.php?pid=1337 #include <cstdio> #include <cstring> #def ...