首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
宝塔
V2EX  ›  Java

为什么 quartz 执行 scheduleJob(),有时候会执行多次啊?

  •  
  •   shayang888 · 320 天前 · 1728 次点击
    这是一个创建于 320 天前的主题,其中的信息可能已经有所发展或是发生改变。
    public class QuartzStudy implements Job {
        @Override
        public void execute(JobExecutionContext jobExecutionContext) {
            System.out.println(jobExecutionContext.getJobDetail().getKey().getName() + "-" + Thread.currentThread().getName() + "-" + Thread.currentThread().getId() + "-" + new Date());
        }
    
        private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        private static Scheduler scheduler;
        static {
            try {
                scheduler = schedulerFactory.getScheduler();
                scheduler.start();
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) throws SchedulerException, InterruptedException {
            JobDetail jobDetail = JobBuilder.newJob(QuartzStudy.class).withIdentity("job1").build();
            CronTrigger trigger = TriggerBuilder.newTrigger()
                    .withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ?").withMisfireHandlingInstructionIgnoreMisfires())
                    .build();
            scheduler.scheduleJob(jobDetail, trigger);
            Thread.sleep(10000);
            scheduler.pauseJob(jobDetail.getKey());
        }
    }
    

    这个的执行结果难道不该是 10 秒的时间打印 2 次,然后就暂停了么 为什么有时候会打印 2 次,有时候会打印 3 次出来?

    job1-DefaultQuartzScheduler_Worker-1-14-Thu Jan 03 09:34:45 CST 2019
    job1-DefaultQuartzScheduler_Worker-2-15-Thu Jan 03 09:34:50 CST 2019
    job1-DefaultQuartzScheduler_Worker-3-16-Thu Jan 03 09:34:55 CST 2019
    
    job1-DefaultQuartzScheduler_Worker-1-14-Thu Jan 03 09:40:45 CST 2019
    job1-DefaultQuartzScheduler_Worker-2-15-Thu Jan 03 09:40:50 CST 2019
    
    10 回复  |  直到 2019-01-04 10:24:09 +08:00
        1
    yukiww233   320 天前
    10s 的区间确实可能会三次,看第 10s 时候的 cpu 时间片分配吧
        2
    shayang888   320 天前
    @yukiww233 那这么说是正常的吗?有什么办法可以保证只执行 2 次吗
        3
    shiww   320 天前
    .withRepeatCount()
        4
    xmh51   320 天前   ♥ 1
    这个问题,因为你设置的不是按照开始任务的时间去执行的。你是按照 秒 /5 的确定时间去执行。55-45 很正常,这个由你启动任务的时间来决定。如果恰好在 5 0 秒启动,则有可能出现执行 3 次的情况。
        5
    shayang888   320 天前
    @shiww 这个是用在 simpletrigger 里的啊 我现在是用 crontrigger
        6
    shayang888   320 天前
    @xmh51 那有什么解决办法吗
        7
    luzemin   320 天前
    @shayang888 设置开始执行的时间
        8
    HiJackXD   320 天前 via iPhone
    关键字 fixdelay
        9
    HiJackXD   320 天前 via iPhone
    额 没注意看代码 。忽略上个回复。
    ------------------------------
    sleep 的时间并不是精确的,线程苏醒后不一定会立刻执行
        10
    shayang888   319 天前
    @HiJackXD 我设置了 startAt 就好了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1368 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 33ms · UTC 23:42 · PVG 07:42 · LAX 15:42 · JFK 18:42
    ♥ Do have faith in what you're doing.