quartz 计算上次触发时间
博客专区 > len 的博客 > 博客详情
quartz 计算上次触发时间
len 发表于4年前
quartz 计算上次触发时间
  • 发表于 4年前
  • 阅读 147
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 产品需求周期任务,但定义的是任务的结束时间,如每天18点完成,但任务的生成时间会是每天8点,如果一个用户在11点新建了这么一个任务,已经过了当天的触发时间,但又没有到任务结束时间,所以产品认为有必要为用户添加一个今天8点到18点的任务,这就涉及到要计算上次触发时间了

产品需求周期任务,但定义的是任务的结束时间,如每天18点完成,但任务的生成时间会是每天8点,如果一个用户在11点新建了这么一个任务,已经过了当天的触发时间,但又没有到任务结束时间,所以产品认为有必要为用户添加一个今天8点到18点的任务,这就涉及到要计算上次触发时间了。因为quartz 提供了从某一个时间计算下次执行时间的接口,一开的设计是在当前时间上往前减一月再以这个时间计算下次执行时间,直到下次执行时间比当次大。平时这个逻辑没发现问题,但有一天为了测试提交了一个每2分钟的任务,结果发现服务没有响应,调试时发现这个计算是很耗时的。于是有发下面的这个方案,原理是认为下次执行时间和上次执行的时间差应该是差不多的,注意是差不多,不是相等,以这个差去计算一个大致的上交执行时间,再以这个时间进行计算。

    public static Date getNextFireTime(String cronExpression) throws Exception {
        return getNextFireTime(new Date(), cronExpression);
    }

    public static Date getNextFireTime(Date date, String cronExpression) throws Exception {
        if (StringUtils.isBlank(cronExpression)) {
            return null;
        }
        CronExpression cron = new CronExpression(cronExpression);
        Date nextFireDate = cron.getNextValidTimeAfter(date);
        return nextFireDate;
    }

    private static Date getPreFireDate(Date pre, Date now, String cronExpression) throws Exception {
        if (pre.after(now)) {
            return null;
        }
        Date next = getNextFireTime(pre, cronExpression);
        if (next.after(now)) {
            return null;
        }
        while (next != null && next.before(now)) {
            pre = next;
            next = getPreFireDate(next, now, cronExpression);
        }
        return pre;
    }

    public static Date getPreFireDate(String cronExpression) throws Exception {
        int i = 0;
        Date now = new Date();
        Date next = now;
        while (true) {
            i++;
            next = getNextFireTime(next, cronExpression);
            long interval = next.getTime() - now.getTime();
            Date pre = new Date(now.getTime() - interval);
            Date result = getPreFireDate(pre, now, cronExpression);//            System.out.println((result == null) + "\t下次执行时间:" + dsf.format(next) + "\t" + dsf.format(pre));
            if (i > 31 || result != null) {
                if (result != null) {
                    System.out.println("最终结果:计算了" + i + "次,|" + "|" + cronExpression + "|,当前时间" + dsf.format(now) + "\t上次应该执行时间:" + dsf.format(result));
                    return result;
                } else {
                    System.err.println("最终结果:计算了" + i + "次,|" + "|" + cronExpression + "|,当前时间" + dsf.format(now) + "\t上次应该执行时间:未知");
                }
                break;
            }
        }
        return null;
    }

以下是测试结果

最终结果:计算了2次,||0 0 0 */1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 00:00:00
cost:10ms
最终结果:计算了2次,||0 0 0 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 00:00:00
cost:4ms
最终结果:计算了1次,||0 0 10 3/1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 10:00:00
cost:2ms
最终结果:计算了2次,||0 0 10 ? * 1,3,5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 10:00:00
cost:2ms
最终结果:计算了1次,||0 0 10 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 10:00:00
cost:1ms
最终结果:计算了2次,||0 0 10 L * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-04-30 10:00:00
cost:2ms
最终结果:计算了5次,||0 0 11 25/2 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-04-29 11:00:00
cost:6ms
最终结果:计算了2次,||0 0 11 25/7 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-04-25 11:00:00
cost:2ms
最终结果:计算了1次,||0 0 12 */1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 12:00:00
cost:0ms
最终结果:计算了1次,||0 0 12 */1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 12:00:00
cost:1ms
最终结果:计算了1次,||0 0 12 */1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 12:00:00
cost:1ms
最终结果:计算了1次,||0 0 12 */1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 12:00:00
cost:1ms
最终结果:计算了1次,||0 0 12 */1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 12:00:00
cost:1ms
最终结果:计算了2次,||0 0 12 */7 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 12:00:00
cost:1ms
最终结果:计算了2次,||0 0 12 */7 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 12:00:00
cost:1ms
最终结果:计算了2次,||0 0 12 */7 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 12:00:00
cost:1ms
最终结果:计算了2次,||0 0 12 */7 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 12:00:00
cost:1ms
最终结果:计算了1次,||0 0 12 ? * 1,2,3,4,5/7|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 12:00:00
cost:1ms
最终结果:计算了1次,||0 0 12 ? * 2,4|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 12:00:00
cost:2ms
最终结果:计算了2次,||0 0 14 ? * 5/14|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 14:00:00
cost:1ms
最终结果:计算了2次,||0 0 17 ? * 5/7|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 17:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 */1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 */5 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-16 18:00:00
cost:1ms
最终结果:计算了1次,||0 0 18 14 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-14 18:00:00
cost:1ms
最终结果:计算了1次,||0 0 18 17 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-17 18:00:00
cost:1ms
最终结果:计算了1次,||0 0 18 20 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 24 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-04-24 18:00:00
cost:2ms
最终结果:计算了2次,||0 0 18 3/1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 3/1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 3/1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 18:00:00
cost:1ms
最终结果:计算了1次,||0 0 18 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 18:00:00
cost:1ms
最终结果:计算了1次,||0 0 18 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 ? * 1,2,3,4,5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1,2,3,4,5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1,2,3,4,5,6,7|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1,2,5,6/21|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-19 18:00:00
cost:1ms
最终结果:计算了1次,||0 0 18 ? * 1,3,5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了1次,||0 0 18 ? * 1/7|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 2|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-19 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 2|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-19 18:00:00
cost:1ms
最终结果:计算了1次,||0 0 18 ? * 2|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-19 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 2/7|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-19 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 3|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 3|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 3|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了1次,||0 0 18 ? * 3|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 3|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 3|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了1次,||0 0 18 ? * 3|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 3|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:0ms
最终结果:计算了1次,||0 0 18 ? * 3,5/21|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 4|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-14 18:00:00
cost:0ms
最终结果:计算了3次,||0 0 18 ? * 4,5/21|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:2ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 ? * 5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 5/7|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 ? * 5/7|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 ? * 5/7|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-15 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 18 L * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-04-30 18:00:00
cost:0ms
最终结果:计算了2次,||0 0 18 L * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-04-30 18:00:00
cost:1ms
最终结果:计算了2次,||0 0 19 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 19:00:00
cost:0ms
最终结果:计算了1次,||0 0 8 21/1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 08:00:00
cost:1ms
最终结果:计算了1次,||0 0 9 */2 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 09:00:00
cost:0ms
最终结果:计算了1次,||0 0 9 */2 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 09:00:00
cost:0ms
最终结果:计算了8次,||0 0 9 25/1 * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-04-30 09:00:00
cost:3ms
最终结果:计算了2次,||0 0/2 * * * ?|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 13:22:00
cost:0ms
最终结果:计算了4次,||0 30 10 ? * 1,5/1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 10:30:00
cost:1ms
最终结果:计算了1次,||0 30 10 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 10:30:00
cost:0ms
最终结果:计算了2次,||0 30 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:30:00
cost:1ms
最终结果:计算了2次,||0 30 18 ? * 1-5|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-20 18:30:00
cost:0ms
最终结果:计算了1次,||0 30 9 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 09:30:00
cost:1ms
最终结果:计算了1次,||0 30 9 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 09:30:00
cost:0ms
最终结果:计算了1次,||0 30 9 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 09:30:00
cost:0ms
最终结果:计算了1次,||0 30 9 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 09:30:00
cost:1ms
最终结果:计算了1次,||0 30 9 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 09:30:00
cost:0ms
最终结果:计算了1次,||0 30 9 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 09:30:00
cost:0ms
最终结果:计算了1次,||0 30 9 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 09:30:00
cost:1ms
最终结果:计算了1次,||0 30 9 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 09:30:00
cost:0ms
最终结果:计算了1次,||0 30 9 ? * 1|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-18 09:30:00
cost:0ms
最终结果:计算了1次,||0 30 9 ? * 2,4,5/7|,当前时间2014-05-21 13:23:08	上次应该执行时间:2014-05-21 09:30:00
cost:1ms


  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 3
博文 3
码字总数 7984
×
len
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: