時區切換致使quartz定時任務沒有觸發問題

時區切換對Quartz的cron表達式有影響,切換的1小時內中止觸發定時任務,致使sla沒有定時清空內存計數,誤發限流。java

美國夏令時PST切換到冬令時PDT,會有時間跳變。不帶時區跳變的,會出現時間重疊或不連續mysql

問題復現sql

mac本機模擬,把時區換成美國的,而後把時間調到11月5號01:59服務器

import java.text.ParseException;
import java.util.Date;

import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzTester {

    public static void main(String[] args) throws ParseException, SchedulerException,
                                           InterruptedException {
        JobDetail jobDetail = new JobDetail("jobDetail", "jobDetail-1", QuartzDemo.class);
        CronTrigger trigger = new CronTrigger();
        trigger.setName("triggerTest");
        trigger.setCronExpression("0/5 * * * * ?");

        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);

        while (true) {
            long current = System.currentTimeMillis();
            System.out.println("normal time now=" + current + ", Date=" + new Date());
            Thread.sleep(5000);
        }
    }

    public static class QuartzDemo implements Job {

        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            long current = System.currentTimeMillis();
            System.out.println("Job now=" + current + ", Date=" + new Date());
        }

    }

}

 

一、把本地時間調到11-05 00:59

normal time now=1509857964930, Date=Sun Nov 05 00:59:24 EDT 2017
Job now=1509857965025, Date=Sun Nov 05 00:59:25 EDT 2017
normal time now=1509857969932, Date=Sun Nov 05 00:59:29 EDT 2017
Job now=1509857970012, Date=Sun Nov 05 00:59:30 EDT 2017
normal time now=1509857974935, Date=Sun Nov 05 00:59:34 EDT 2017
Job now=1509857975017, Date=Sun Nov 05 00:59:35 EDT 2017
normal time now=1509857979940, Date=Sun Nov 05 00:59:39 EDT 2017
Job now=1509857980020, Date=Sun Nov 05 00:59:40 EDT 2017
normal time now=1509857984944, Date=Sun Nov 05 00:59:44 EDT 2017
Job now=1509857985021, Date=Sun Nov 05 00:59:45 EDT 2017
normal time now=1509857989949, Date=Sun Nov 05 00:59:49 EDT 2017
Job now=1509857990013, Date=Sun Nov 05 00:59:50 EDT 2017
normal time now=1509857994952, Date=Sun Nov 05 00:59:54 EDT 2017
Job now=1509857995011, Date=Sun Nov 05 00:59:55 EDT 2017
normal time now=1509857999954, Date=Sun Nov 05 00:59:59 EDT 2017
normal time now=1509858004959, Date=Sun Nov 05 01:00:04 EDT 2017
normal time now=1509858009959, Date=Sun Nov 05 01:00:09 EDT 2017
normal time now=1509858014962, Date=Sun Nov 05 01:00:14 EDT 2017
normal time now=1509858019966, Date=Sun Nov 05 01:00:19 EDT 2017
normal time now=1509858024970, Date=Sun Nov 05 01:00:24 EDT 2017ide

從Nov 05 01:00開始,quartz的定時任務就停了spa

二、把本地時間調到11-05 01:10

信息: Quartz scheduler version: 1.5.2
Nov 05, 2017 1:10:07 AM org.quartz.core.QuartzScheduler start
信息: Scheduler DefaultQuartzScheduler$NON_CLUSTERED started.
normal time now=1509858607008, Date=Sun Nov 05 01:10:07 EDT 2017
normal time now=1509858612016, Date=Sun Nov 05 01:10:12 EDT 2017
normal time now=1509858617018, Date=Sun Nov 05 01:10:17 EDT 2017
normal time now=1509858622022, Date=Sun Nov 05 01:10:22 EDT 2017
normal time now=1509858627022, Date=Sun Nov 05 01:10:27 EDT 2017
normal time now=1509858632026, Date=Sun Nov 05 01:10:32 EDT 2017
normal time now=1509858637030, Date=Sun Nov 05 01:10:37 EDT 2017
normal time now=1509858642030, Date=Sun Nov 05 01:10:42 EDT 2017code

quartz的定時任務一直沒有觸發orm

三、把本地時間調到11-05 01:59

normal time now=1509861583050, Date=Sun Nov 05 01:59:43 EDT 2017
normal time now=1509861588058, Date=Sun Nov 05 01:59:48 EDT 2017
normal time now=1509861593061, Date=Sun Nov 05 01:59:53 EDT 2017
normal time now=1509861598066, Date=Sun Nov 05 01:59:58 EDT 2017
normal time now=1509861603070, Date=Sun Nov 05 01:00:03 EST 2017
normal time now=1509861608072, Date=Sun Nov 05 01:00:08 EST 2017
normal time now=1509861613076, Date=Sun Nov 05 01:00:13 EST 2017
normal time now=1509861618080, Date=Sun Nov 05 01:00:18 EST 2017
normal time now=1509861623081, Date=Sun Nov 05 01:00:23 EST 2017
normal time now=1509865173966, Date=Sun Nov 05 01:59:33 EST 2017 //這裏調整了系統時間
normal time now=1509865178970, Date=Sun Nov 05 01:59:38 EST 2017
normal time now=1509865183975, Date=Sun Nov 05 01:59:43 EST 2017
Job now=1509865185057, Date=Sun Nov 05 01:59:45 EST 2017
normal time now=1509865188977, Date=Sun Nov 05 01:59:48 EST 2017
Job now=1509865190012, Date=Sun Nov 05 01:59:50 EST 2017
normal time now=1509865193980, Date=Sun Nov 05 01:59:53 EST 2017
Job now=1509865195015, Date=Sun Nov 05 01:59:55 EST 2017
normal time now=1509865198985, Date=Sun Nov 05 01:59:58 EST 2017
Job now=1509865200022, Date=Sun Nov 05 02:00:00 EST 2017
normal time now=1509865203990, Date=Sun Nov 05 02:00:03 EST 2017
Job now=1509865205011, Date=Sun Nov 05 02:00:05 EST 2017
normal time now=1509865208995, Date=Sun Nov 05 02:00:08 EST 2017
Job now=1509865210016, Date=Sun Nov 05 02:00:10 EST 2017
normal time now=1509865214000, Date=Sun Nov 05 02:00:14 EST 2017
Job now=1509865215019, Date=Sun Nov 05 02:00:15 EST 2017blog

從夏令時的2點跳到冬令時的1點,quartz的定時任務沒有開始執行,直到冬令時的2點,quartz的定時任務纔開始執行。內存

結論

從夏令時的1點開始,到冬令時的2點,quartz都沒觸發定時任務,因此期間重啓服務器也沒用。

受時區影響的影響的:
Date()的分鐘級加減
Calendar
mysql
把Date時間轉成字符串,再轉回Date
quartz的cron表達式

本機時區設置

相關文章
相關標籤/搜索