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

2019-01-03 09:41:16 +08:00
 shayang888
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
3324 次点击
所在节点    Java
10 条回复
yukiww233
2019-01-03 10:03:02 +08:00
10s 的区间确实可能会三次,看第 10s 时候的 cpu 时间片分配吧
shayang888
2019-01-03 10:12:34 +08:00
@yukiww233 那这么说是正常的吗?有什么办法可以保证只执行 2 次吗
shiww
2019-01-03 10:39:08 +08:00
.withRepeatCount()
xmh51
2019-01-03 10:47:30 +08:00
这个问题,因为你设置的不是按照开始任务的时间去执行的。你是按照 秒 /5 的确定时间去执行。55-45 很正常,这个由你启动任务的时间来决定。如果恰好在 5 0 秒启动,则有可能出现执行 3 次的情况。
shayang888
2019-01-03 10:52:24 +08:00
@shiww 这个是用在 simpletrigger 里的啊 我现在是用 crontrigger
shayang888
2019-01-03 11:04:02 +08:00
@xmh51 那有什么解决办法吗
luzemin
2019-01-03 11:20:30 +08:00
@shayang888 设置开始执行的时间
HiJackXD
2019-01-04 06:09:41 +08:00
关键字 fixdelay
HiJackXD
2019-01-04 06:19:23 +08:00
额 没注意看代码 。忽略上个回复。
------------------------------
sleep 的时间并不是精确的,线程苏醒后不一定会立刻执行
shayang888
2019-01-04 10:24:09 +08:00
@HiJackXD 我设置了 startAt 就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/523339

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX