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

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

  •  
  •   shayang888 · 2019-01-03 09:41:16 +08:00 · 3318 次点击
    这是一个创建于 1932 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    yukiww233
        1
    yukiww233  
       2019-01-03 10:03:02 +08:00
    10s 的区间确实可能会三次,看第 10s 时候的 cpu 时间片分配吧
    shayang888
        2
    shayang888  
    OP
       2019-01-03 10:12:34 +08:00
    @yukiww233 那这么说是正常的吗?有什么办法可以保证只执行 2 次吗
    shiww
        3
    shiww  
       2019-01-03 10:39:08 +08:00
    .withRepeatCount()
    xmh51
        4
    xmh51  
       2019-01-03 10:47:30 +08:00   ❤️ 1
    这个问题,因为你设置的不是按照开始任务的时间去执行的。你是按照 秒 /5 的确定时间去执行。55-45 很正常,这个由你启动任务的时间来决定。如果恰好在 5 0 秒启动,则有可能出现执行 3 次的情况。
    shayang888
        5
    shayang888  
    OP
       2019-01-03 10:52:24 +08:00
    @shiww 这个是用在 simpletrigger 里的啊 我现在是用 crontrigger
    shayang888
        6
    shayang888  
    OP
       2019-01-03 11:04:02 +08:00
    @xmh51 那有什么解决办法吗
    luzemin
        7
    luzemin  
       2019-01-03 11:20:30 +08:00
    @shayang888 设置开始执行的时间
    HiJackXD
        8
    HiJackXD  
       2019-01-04 06:09:41 +08:00 via iPhone
    关键字 fixdelay
    HiJackXD
        9
    HiJackXD  
       2019-01-04 06:19:23 +08:00 via iPhone
    额 没注意看代码 。忽略上个回复。
    ------------------------------
    sleep 的时间并不是精确的,线程苏醒后不一定会立刻执行
    shayang888
        10
    shayang888  
    OP
       2019-01-04 10:24:09 +08:00
    @HiJackXD 我设置了 startAt 就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5293 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:43 · PVG 15:43 · LAX 00:43 · JFK 03:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.