时区切换导致quartz定时任务没有触发问题

author author     2022-09-29     497

关键词:

时区切换对Quartz的cron表达式有影响,切换的1小时内停止触发定时任务,导致sla没有定时清空内存计数,误发限流。

美国夏令时PST切换到冬令时PDT,会有时间跳变。不带时区跳变的,会出现时间重叠或不连续

问题复现

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());
        }

    }

}

 

1、把本地时间调到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 2017

从Nov 05 01:00开始,quartz的定时任务就停了

2、把本地时间调到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 2017

quartz的定时任务一直没有触发

3、把本地时间调到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 2017

从夏令时的2点跳到冬令时的1点,quartz的定时任务没有开始执行,直到冬令时的2点,quartz的定时任务才开始执行。

结论

从夏令时的1点开始,到冬令时的2点,quartz都没触发定时任务,所以期间重启服务器也没用。

受时区影响的影响的:
Date()的分钟级加减
Calendar
mysql
把Date时间转成字符串,再转回Date
quartz的cron表达式

本机时区设置

spring集成quartz时区问题造成任务晚执行八小时

...定时任务都是到了八点多才执行,经过一番查找,可能是时区问题造成的。一种解决办法是在JVM启动参数中增加--Duser.timezone=GMT+08另一种办法是在配置文件中增加timeZone的配置改JVM参数的方式,一但项目迁移实施人员可能会忘记... 查看详情

将celery定时任务设置为根据本地时区触发

默认celery的时区为UTC,如果要在django项目中将celery定时任务配置为根据本地时区触发,则需要修改在setttings.py添加以下任意一行:#celery相关配置CELERY_TIMEZONE=‘Asia/Shanghai‘CELERY_ENABLE_UTC=False 查看详情

定时调度框架quartz可以定义单个触发器多个任务吗

...个触发器只能单个任务,单个任务可以多个触发器触发。Quartz是一个用Java编写的任务调度框架,任务调度是什么,举例说明:比如需要在每个星期四下午三点时候发周报,我们需要一个系统在两点半的时候给一个发周报的提醒... 查看详情

任务调度开源框架quartz动态添加修改和删除定时任务

Quartz是个开源的作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听。Quartz允... 查看详情

quartz框架简介

...运行规则,控制作业的运行时间。其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。主要用来执行定时任务,如:定时发送信息、定时生成报表等等。 二、相关术语:     ... 查看详情

quartz定时任务第一次不执行

随时往quartz数据库中添加定时任务,通过一个定时任务每天定点去启动quartz数据库中的任务,但是,quartz数据库中的第一次添加的任务不会执行,比如:0589**?,添加这个任务,必须到明天的这个点才执行。请高手指点,谢谢。... 查看详情

quartz定时任务(代码片段)

Quartz可以用来做什么?Quartz是一个任务调度框架。比如你遇到这样的问题想每月25号,信用卡自动还款想每年4月1日自己给当年暗恋女神发一封匿名贺卡想每隔1小时,备份一下自己的爱情动作片学习笔记到云盘这些问题总结起来... 查看详情

为啥jenkins设置了定时构建但没触发?

...后,还是未生效有时候jenkins在linux下部署的话,就会存在时区问题一说,jenkins构建在启动时加入time-zone时区可以解决,但在周期构建时,特别要注意时区并转换,如下图写完后,jenkins会提示什么时候运行,这时要注意些的是什... 查看详情

quartz定时任务触发器启动时设置(代码片段)

需求为了将触发器的Cron表达式放在数据库里,方便维护。所以需要在项目启动时去数据库获取Cron表达式,并配置触发器,添加到调度器里。实现在配置定时任务相关的Bean时,通过设置init方法,实现配置Bean时执行从数据库获取C... 查看详情

quartz定时任务最小时间是多少

参考技术AQuartz是Jobscheduling(作业调度)领域的一个开源项目,Quartz既可以单独使用也可以跟spring框架整合使用,在实际开发中一般会使用后者。使用Quartz可以开发一个或者多个定时任务,每个定时任务可以单独指定执行的时间... 查看详情

定时任务框架-quartz时间配置

quartz定时任务时间设置:这些星号由左到右按顺序代表:*******格式:[秒][分][小时][日][月][周][年]*表示所有值.例如:在分的字段上设置"*",表示每一分钟都会触发。?表示不指定值。使用的场景为不需要关心当前设置这个字段的值。... 查看详情

quartz定时任务时间设置

quartz定时任务时间设置:这些星号由左到右按顺序代表:*******格式:[秒][分][小时][日][月][周][年]通配符说明:*表示所有值.例如:在分的字段上设置"*",表示每一分钟都会触发。?表示不指定值。使用的场景为不需要关... 查看详情

quartz重复执行问题记录

参考技术A现象:在项目维护过程中,使用了Quartz框架,也就是定时执行任务的功能。但是,在多节点多并发的过程中,出现了一个问题,同一个trigger被多个机器重复的触发了。Quartz的运行流程:当任务达到触发条件的时候(当... 查看详情

关于quartz的同步处理问题

...始,JOB执行7秒,下一个JOB开始时间为5秒;问题:想知道QUARTZ是否可设置任务同步?既任务链为串行。一个QUARTZ只能有一个线程任务在跑。好像同一时间只能执行一个任务,其他的定时任务在上一个任务结束前是不会启动的。参... 查看详情

分布式定时任务调度框架-quartz学习及实战记录笔记

目录1.Quartz入门2.Quartz中的常用组件之间的关系3.Trigger触发器的介绍4.Quartz配置资源介绍5.Quartz监听器6.SpringBoot整合Quartz实现动态的创建或删除定时任务并将定时调度任务持久化到MySQL以及Quartz集群配置7.分布式定时任务调度框架学... 查看详情

分布式定时任务调度框架-quartz学习及实战记录笔记

目录1.Quartz入门2.Quartz中的常用组件之间的关系3.Trigger触发器的介绍4.Quartz配置资源介绍5.Quartz监听器6.SpringBoot整合Quartz实现动态的创建或删除定时任务并将定时调度任务持久化到MySQL以及Quartz集群配置7.分布式定时任务调度框架学... 查看详情

quartz的定时任务。我要每隔24小时执行一次。quartz怎么设置。

如题1、首先新建一个控制台程序,利用Nuget引入Quartz的程序包,同时会自动引入日志库,用于输入日志,如下图所示。2、配置项目目录下的App.Config文件,如下图所示,注意configSections一定要放在第一个节点。3、编写需要执行的... 查看详情

spring+quartz实现定时任务job集群配置

 为什么要有集群定时任务?因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真实结果的3倍,那对银行来说是无法想象... 查看详情