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